- План игры:
- Принципиальная электрическая схема:
- Предварительные условия:
- Программирование Arduino для игры Space Race:
- Arduino Space Racer Game работает:
Программирование всегда доставляло удовольствие, и с платформами разработки, такими как Arduino, оно стало намного лучше. Почти каждый программист здесь попытался бы разработать какую-нибудь игру, используя язык, который они изучают / практикуют. Это помогает им улучшить свои навыки программирования увлекательным, но продуктивным способом. Я был большим поклонником Arduino с тех пор, как познакомился с ней, и всегда хотел попробовать с ней что-нибудь крутое, когда узнал, насколько крутым он может быть с графическим ЖК-дисплеем, таким как Nokia 5110, вместе с Arduino моя идея разработки игры Это был интересный способ развить некоторые навыки программирования и в то же время развлечься, так что, хотя вы, ребята, тоже могли быть заинтересованы в разработке своей игры. Следовательно, в этом уроке мы узнаем, как создать достойную игру с использованием Arduino и графических ЖК-дисплеев.
Мы уже создали эту старомодную игру Snake с использованием Arduino, поэтому на этот раз мы пробуем что-то новое и назвали эту игру Space Race Game, где вам нужно защитить свой корабль от вражеских кораблей с помощью джойстика.
План игры:
Прежде чем мы начнем, очень важно спланировать, как ваша игра будет работать. Я выбрал графический ЖК-дисплей Nokia5110 и джойстик в качестве оборудования. Я предполагаю, что в этом уроке вы тоже выбрали то же самое. Поскольку в Nokia 5110 не так много места, мы спланировали всю игру в рамках разрешения экрана 84 * 48 пикселей. Мы уже сделали учебники о том, как подключить ЖК-дисплей Nokia 5110 к Arduino и джойстику к Arduino.
В этом пространстве мы должны плотно вписаться в игровую зону и область табло, на которой будут отображаться такие вещи, как счет и тому подобное. Очень важно знать расположение пикселей, в котором вы размещаете материал, чтобы отслеживать расположение пикселей и обновлять их на экране.
После того, как будет решен внешний вид игрового экрана, мы должны выбрать персонажей в нашей игре. В моей игре их всего два: персонаж игрока, который является космическим кораблем, и персонаж противника, который должен выглядеть как космический корабль пришельцев. ЖК-дисплей Nokia может отображать растровые изображения, поэтому я решил использовать эту опцию для отображения моего космического корабля и врагов.
Таким образом, у нас будет космический корабль, который мчится через космические корабли пришельцев, у этого космического корабля будет три полосы движения, которые нужно изменить, чтобы избежать столкновения с пришельцами. Все время пришельцы могут занимать только две дорожки, и игрок должен иметь возможность проехать по свободной дорожке. Как только эти идеи будут реализованы, мы можем перейти к аппаратному обеспечению, а затем к программированию.
Принципиальная электрическая схема:
Схема для этой игры Arduino очень проста; нам просто нужно связать ЖК-модуль Nokia 5110 и джойстик с Arduino. Полная принципиальная схема показана ниже.
ЖК-дисплей Nokia 5110 работает с напряжением 3,3 В, а модуль джойстика работает с напряжением 5 В, поэтому убедитесь, что вы подключаете ЖК-дисплей только к напряжению 3,3 В, поскольку 5 В могут повредить его. ЖК-дисплей связывается с Arduino по протоколу SPI, а джойстик считывает только АЦП, чтобы считывать изменение напряжения. Настройка подключения будет выглядеть примерно так, как показано ниже.
Предварительные условия:
Прежде чем мы погрузимся в программирование, важно, чтобы вам было удобно работать с модулем дисплея и джойстиком, поэтому вы можете использовать следующие руководства, чтобы узнать о них больше, а затем вернуться сюда, чтобы убедиться, что все работает так, как мы это нужно!
- Интерфейс ЖК-дисплея Nokia 5110 с Arduino
- Модуль джойстика, взаимодействующий с Arduino
Программирование Arduino для игры Space Race:
Полная программу для игры можно найти в конце этой страницы; вы можете использовать его прямо в своей Arduino IDE и загрузить на свою доску. Но если вы хотите знать, что на самом деле происходит внутри кода, читайте дальше.
Как всегда, мы начинаем нашу программу с добавления файлов заголовков нашей библиотеки, нам нужны три библиотеки для этого проекта, из которых библиотека SPI добавляется в вашу среду IDE по умолчанию. Две другие библиотеки необходимо загрузить со страницы Adafruit Github. Следуйте инструкциям по подключению к ЖК-дисплею, упомянутым в разделе предварительных требований, если вы не знаете, как добавить библиотеку.
#включают
Если вы следовали руководству, вы должны знать, что растровые изображения можно отображать на ЖК-дисплее. Поэтому нам нужно преобразовать требуемое изображение в растровый код с помощью программного обеспечения, упомянутого в руководстве, вы можете выбрать любое изображение из Интернета и использовать его, преобразовав его в растровый код. Убедитесь, что изображение достаточно простое, чтобы его можно было отобразить на ЖК-экране, проверьте предварительный просмотр перед тем, как на самом деле пробовать на ЖК-экране. В нашей программе мы использовали два растровых символа: один - космический корабль, а другой - вражеский корабль, растровый код для обоих добавлен в наш код, как показано ниже.
// Растровые данные для SpaceShip static const unsigned char PROGMEM ship = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B00011110000, B00001101, B11100000, B000110000111, B00001101 B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Битовые данные для вражеского корабля static const unsigned char PROGMEM врага = { B00000101, B11000000, B00001011, B11100000, B00000011, B11100000, B00110011, B11111000, B01111111, B11111100, B10111111, B11111010, B01110111, B11011100, B01111110, B11111100, B00111111, B11111100, B11101111, B11101110, B11000001, B00000110, B10000001, B00000010, B10000000, B00000010, B00000000, B00000000, };
Мы должны указать контакты, к которым подключен дисплей Nokia LCD 5110. Связь с дисплеем осуществляется через интерфейс SPI. Если вы следовали приведенной выше принципиальной схеме, код для инициализации ЖК-дисплея будет следующим: вам не нужно его изменять.
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Укажите контакты, к которым подключен ЖК-дисплей
Внутри функции настройки мы просто запускаем последовательный монитор со скоростью 9600 бод, чтобы мы могли отлаживать данные, а затем инициализировать ЖК-дисплей. Мы также должны установить контрастность ЖК-дисплея, каждый дисплей будет работать лучше всего при разном уровне контрастности, поэтому поиграйте со значением, чтобы выбрать наиболее подходящее для вас. Наконец, мы также очищаем экран дисплея, чтобы начать все заново.
void setup () { Serial.begin (9600); // Монитор последовательного порта для отладки display.begin (); // Запускаем коммуникационный ЖК-дисплей display.setContrast (30); // Устанавливаем контрастность дисплея display.clearDisplay (); // очищаем экран и начинаем заново }
Как только экран очищается, мы переходим к функции цикла и там отображаем игровой экран. Игровой экран - это не что иное, как отображение основного скелета игры, а также очков и уровня скорости. Мы использовали функцию линии, чтобы нарисовать три линии в качестве границ, и справа мы отображаем счет текста и скорость, как старые портативные игровые устройства в стиле ретро.
void gamescreen () { // Рисуем границу экрана display.drawLine (0, 0, 0, 47, ЧЕРНЫЙ); display.drawLine (50, 0, 50, 47, ЧЕРНЫЙ); display.drawLine (0, 47, 50, 47, ЧЕРНЫЙ); // Введите тексты по умолчанию display.setTextSize (1); display.setTextColor (ЧЕРНЫЙ); display.setCursor (52,2); display.println («Скорость»); display.setCursor (54,12); display.println (game_speed); display.setCursor (52,25); display.println («Оценка»); display.setCursor (54,35); display.println (оценка); }
Затем мы должны получить ввод от пользователя, чтобы позволить ему / ей управлять космическим кораблем. Входной сигнал будет поступать от модуля джойстика, который подключен к контакту A1. Аналоговое значение датчика будет 512, если он не перемещается, и будет увеличиваться и уменьшаться при перемещении по оси X. Мы используем эти значения, чтобы определить, хочет ли пользователь двигаться влево или вправо. Вам следует прочитать руководство по взаимодействию джойстика с Arduino, указанное в предварительных требованиях, если вам трудно понять приведенную ниже программу.
// Получение ввода от пользователя Joy_X = analogRead (A1); // Считываем значение X с джойстика if (Joy_X <312 && POS! = 1 && control == true) // Если джойстик перемещается вправо {POS--; control = false;} // Уменьшаем положение космического корабля else if (Joy_X> 712 && POS! = 3 && control == true) // Если джойстик движется вправо {POS ++; control = false;} // Увеличиваем позицию космического корабля else if (Joy_X> 502 && Joy_X <522) // Если джойстик возвращается в исходное положение control = true; // Готовим к следующему ходу // Получен ввод от пользователя
Получив от пользователя положение космического корабля, мы должны разместить космический корабль в этом конкретном месте. Мы используем приведенную ниже функцию и передаем значение позиции в качестве параметра, а затем в зависимости от положения космического корабля на его соответствующем треке.
void player_car (char pos) // Поместите космический корабль на основе выбранной пользователем позиции { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); если (pos == 2) display.drawBitmap (18, 32, корабль, 15, 15, ЧЕРНЫЙ); если (pos == 3) display.drawBitmap (34, 32, корабль, 15, 15, ЧЕРНЫЙ); }
Теперь, когда наш космический корабль помещен на экран и готов к гонке, мы должны представить вражеские корабли, которые будут соревноваться вместе с игроком. Каждый раз, когда вражеский корабль пересекает экран, мы предполагаем, что он мертв, а когда он мертв, мы должны создать новый космический корабль. Следующая функция делает то же самое. Он создает новую позицию для двух вражеских кораблей и помещает их в верхнюю часть экрана.
if (enemy_dead) // Проверка мертвых кораблей противника {// Если они мертвые вражеские_0_pos = POS; // создаем первого врага над космическим кораблем врага_1_pos = random (0,4); // создаем второго врага в каком-то другом случайном месте врага_phase = 0; // Вывести врага на вершину врага_dead = false; // Враг создан, поэтому он больше не мертв }
После размещения вражеских кораблей в верхней части экрана мы должны опустить их так, чтобы они пронеслись так, как будто наш игрок мчится вверх, для этого нам просто нужно увеличить фазу (место, где отображается изображение), чтобы он спускается медленно. То же самое делается для обоих вражеских кораблей, как показано ниже.
вражеский_ корабль (вражеский_0_пос, вражеский_фаз); вражеская_фаза ++; // Поместите первого врага на экран и сбейте его вражеский корабль (врага_1_pos, врага_фаза); вражеская_фаза ++; // Поместите второго врага на экран и сбейте его
Ниже показана функция вражеского корабля , она очень похожа на функцию машины игрока, но здесь у нас есть два параметра. Один предназначен для размещения врага на трассе, а другой - для перемещения врага вниз.
void own_ship (int place, int phase) // Поместите вражеский корабль на новое место и в фазе { if (place == 1) display.drawBitmap (2, phase, неприятель, 15, 15, ЧЕРНЫЙ); если (место == 2) display.drawBitmap (18, фаза, враг, 15, 15, ЧЕРНЫЙ); если (место == 3) display.drawBitmap (34, фаза, враг, 15, 15, ЧЕРНЫЙ); }
Следующий фрагмент кода должен проверить, уклонился ли космический корабль от вражеского корабля. Чтобы проверить это, нам нужно знать положение кораблей противника и космического корабля игрока. Поскольку мы все это знаем, нам просто нужно проверить, совпадает ли позиция космического корабля с кораблем противника. Мы проверяем это, только если вражеский корабль подошел к космическому кораблю. Если игрок не избежал врага, игра окончена.
if (enemy_phase> 22 && ((anti_0_pos == POS) - (enemy_1_pos == POS))) // Если космический корабль касается любого из врагов game_over (); // Отображение игры
Если игрок успешно избежал врага, мы должны убить врага и дать игроку очко. Для этого мы просто проверяем, дошел ли враг до нижней части экрана, и если это так, мы убиваем его, используя код ниже
if (enemy_phase> 40) // Если космический корабль ускользает от врагов {врага_dead = true; score ++;} // Увеличиваем счет и убиваем врагов
Как это было бы весело, если бы мы не увеличивали сложность игры по мере того, как мы набираем высокие баллы. Таким образом, мы используем другую функцию, которая затем отслеживает счет игрока и в зависимости от результата увеличивает скорость игры. Скорость фактически контролируется с помощью функции задержки, которая контролирует интервал обновления игры, делая ее быстрой или медленной.
void Level_Controller () // Увеличиваем скорость игры в зависимости от счета. { if (score> = 0 && score <= 10) // Если счет 0-10 { game_speed = 0; задержка (80); // замедлить игру на 80 мс } if (score> 10 && score <= 20) // If score 10-40 { game_speed = 1; задержка (70); // замедлить игру на 70 мс } if (score> 20 && score <= 30) // If score 20-40 { game_speed = 2; задержка (60); // замедлить игру на 60 мс } if (score> 30 && score <= 40) // If score 30-40 { game_speed = 3; задержка (50); // замедляем игру на 50 мс } }
Arduino Space Racer Game работает:
Убедившись, что оборудование и программа понятны, просто соберите схему и загрузите код на плату Arduino. Вы должны заметить начало игры, как показано ниже.
Используйте джойстик, чтобы избежать вражеского корабля, двигаясь влево или вправо. За уклонение от каждого врага вы увеличите свой счет на единицу. Когда счет становится высоким, скорость игры также увеличивается, то есть скорость увеличивается на 10 мс за каждые 10 очков, которые вы набираете. Вы можете продолжить и развивать эту игру, чтобы вводить новые уровни или каждый вносить некоторые аппаратные изменения, чтобы контролировать его движение с помощью акселерометра. Творчество - единственный предел. Для справки вы узнаете, как использовать акселерометр с Arduino здесь.
Надеюсь, вы поняли проект и получили удовольствие от его создания. Если вы столкнулись с какой-либо проблемой, заставив это работать, пожалуйста, не стесняйтесь сообщать о проблеме в разделе комментариев ниже или использовать форумы для технической помощи. Удачной игры !!
Проверьте полный код и демонстрационное видео ниже.