Игра "космическая гонка" с использованием Arduino и дисплея Nokia 5110

С тех пор как появилось программирование появились и различные электронные игры. При этом программированием игр часто занимаются даже опытные программисты, улучшая с помощью этого свои навыки программирования, а также получая удовольствие от создания интересной игры.

Внешний вид игры "космическая гонка" с использованием Arduino и дисплея Nokia 5110

В этом проекте мы рассмотрим создание с помощью платформы Arduino игры под названием "космическая гонка", в которую можно будет играть на графическом ЖК дисплее Nokia 5110 - его подключение к плате Arduino мы рассматривали в этой статье. Этакий "олдскульный" графический дисплей от бывшего флагмана в производстве сотовых телефонов.

Также на нашем сайте вы можете посмотреть похожий проект – игра в змейку с помощью Arduino.

Основные принципы создания игры

Перед началом создания данного проекта удостоверьтесь в том, что вы уже освоили подключение к плате Arduino дисплея Nokia 5110 и джойстика. Поскольку дисплей Nokia 5110 (купить на AliExpress) не может похвастаться приличным разрешением ограничимся разрешением 84х48 пикселов для нашей игры.

Внешний вид ЖК дисплея Nokia 5110

Внутри этого пространства необходимо разместить игровую зону и служебную зону, в которой будет отображаться счет игры и некоторые другие вещи. Необходимо будет с точностью до пикселя знать все размеры этих зон.

Теперь необходимо определиться с объектами в нашей игре. Первым объектом будет наш космический корабль, а вторым – вражеский космический корабль. Поскольку дисплей Nokia 5110 может отображать растровые изображения (bitmap images), то мы можем использовать это чтобы отображать на его экране эти два объекта космических кораблей.

Таким образом, у нас будет космический корабль, который будет лететь сквозь рой вражеских кораблей, пытаясь уклониться от встречи с ними – для этого у него будет три линии, по которым он будет маневрировать. В любой момент времени вражеские корабли могут занимать только две линии, поэтому у игрока будет всегда возможность переместиться на свободную линию.

Работа схемы

Схема устройства для игры в космическую гонку представлена на следующем рисунке.

Схема устройства для игры в космическую гонку

Как видите, схема очень проста – достаточно подключить к плате Arduino ЖК дисплей Nokia 5110 и джойстик.

Джойстик работает от питающего напряжения 5V, а ЖК дисплей Nokia 5110 – от напряжения 3.3V, поэтому убедитесь в том что вы его подключили к разъему 3.3V платы Arduino, а не к 5V – иначе можно необратимо повредить дисплей. ЖК дисплей Nokia 5110 взаимодействует с платой Arduino по протоколу SPI, а значения с выхода джойстика считываются с помощью аналого-цифрового преобразователя (АЦП) на контакте A1 платы Arduino.

После сборки схемы на макетной плате у вас должна получиться примерно следующая конструкция.

Внешний вид собранной конструкции для игры в космическую гонку

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же рассмотрим его основные фрагменты.

Вначале в программе нам необходимо подключить заголовочные файлы библиотек, которые мы будем использовать. Библиотека для работы SPI по умолчанию присутствует в Arduino IDE, остальные две библиотеки необходимо скачать с Github. Работа с ними более подробно рассмотрена в статье про подключение ЖК дисплея Nokia 5110 к плате Arduino.

ЖК дисплей Nokia 5110 позволяет отображать растровые/точечные изображения (bitmap images). Более подробно про конвертирование изображений в шестнадцатеричный код для данного дисплея можно прочитать в уже упоминавшейся статье про подключение этого дисплея к плате Arduino. Поэтому вместо использованных нами изображений для отображения космических кораблей (нашего и вражеских) вы можете использовать любые изображения, скачанные из интернета – главное чтобы по размеру они подходили к размеру экрана нашего дисплея. Далее приведены коды для использованных нами изображений космических кораблей.

Далее в программе мы должны указать плате Arduino к каким ее контактам подключен ЖК дисплей Nokia LCD 5110. Если вы использовали соединения как в представленной нами схеме, то когда код этой команды будет следующий:

Внутри функции void setup() мы инициализируем последовательную связь со скорость 9600 бод/с (для целей отладки программы) и ЖК дисплей. Далее установим нужную нам контрастность ЖК дисплея – можете поэкспериментировать со значением контрастности чтобы игра наилучшим образом смотрелась на вашем дисплее. И затем очистим экран ЖК дисплея.

После очистки экрана дисплея мы попадаем в функцию loop, в которой мы будем отображать экран нашей игры, который представляет собой "скелет" игры и кроме самого процесса игры на нем еще отображается счет и скорость нашего космического корабля. Мы использовали функцию line чтобы нарисовать линии (дорожки) для движения нашего корабля. Как можно видеть, у нас получился интерфейс, похожий на интерфейс старых "олдскульных" игр для игровых приставок.

Далее в программе мы должны считывать от пользователя сигналы управления космическим кораблем, которые передаются к нам в плату Arduino от джойстика, подключенного к контакту A1. Если рукоятка джойстика находится в среднем положении, то на выходе АЦП контакта A1 будет значение 512 – при движении рукоятки джойстика вдоль оси X это значение будет изменяться. Мы будем использовать это чтобы определить в какую сторону наклонена рукоятка джойстика – вправо или влево. Более подробно о работе с джойстиком можно прочитать в статье про его подключение к плате Arduino.

После получения позиции космического корабля от пользователя мы должны разместить его на экране дисплея в соответствующей позиции.

Теперь, когда наш космический корабль размещен на экране дисплея в нужной позиции, мы должны смоделировать на экране дисплея движение вражеских космических кораблей. Каждый раз когда вражеский корабль будет пересекать линию экрана мы будем считать его мертвым и создавать новый вражеский корабль – это выполняется в следующей нижеприведенной функции. В этой функции создается новая позиция для двух вражеских кораблей и они размещаются вверху экрана.

После помещения вражеских кораблей на верх экрана мы должны постепенно перемещать их вниз чтобы у пользователя создавалось впечатление что он на своем космическом корабле летит вперед.

В функции enemy_ship мы отображаем вражеский корабль в нужном нам месте. Ее параметры: place – позиция корабля по горизонтали (она неизменна после создания корабля), phase – позиция корабля по вертикали (она изменяется в процессе перемещения вражеского корабля).

В следующем фрагменте кода проверяется избежал ли наш корабль столкновения с вражеским кораблем. Чтобы проверить это нам нужно знать позиции обоих кораблей. Если пользователю не удалось избежать столкновения с вражеским кораблем, это будет означать конец игры.

Если пользователь удачно избежал столкновения с вражеским кораблем мы убиваем вражеский корабль и начисляем пользователю один балл (счета). Чтобы осуществить это мы проверяем достиг ли вражеский корабль низа экрана и если достиг, то мы убиваем его с помощью следующего фрагмента кода.

Но в любой игре интересно увеличивать ее сложность по мере того как мы начинаем играть в нее все лучше и лучше. Поэтому в следующей функции мы анализируем счет игры и зависимости от его значения увеличиваем скорость игры – это мы делаем с помощью функции delay, которая управляет интервалом между событиями игры.

Тестирование игры “космическая гонка”

После того, как будет готова аппаратная часть проекта, можете приступать к загрузке программы в плату Arduino. После окончания загрузки программы вы должны на экране ЖК дисплея увидеть следующую картину:

Начало игры

Далее используйте джойстик чтобы уклониться вашим кораблем от столкновения с вражескими кораблями наклоняя рукоятку джойстика вправо или влево. По мере увеличения счета будет увеличиваться скорость игры – задержка, регулирующая скорость игры, будет уменьшаться на 10 мс на каждые 10 единиц счета. Вы можете усовершенствовать этот проект игры “космическая гонка” на основе добавления в нее акселерометра или внести в нее любые другие изменения на ваш вкус.

Исходный код программы

Комментарии к исходному коду программы переведены в разделе статьи, посвященном объяснению программы. Если вам нужна помощь в объяснении каких либо фрагментов этой программы – пишите об этом в комментариях к данной статье, постараюсь помочь.

Видео, демонстрирующее работу схемы

(Проголосуй первым!)
Загрузка...
76 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *