Рубрики
Схемы на Arduino

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

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

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

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

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

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

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

Теперь необходимо определиться с объектами в нашей игре. Первым объектом будет наш космический корабль, а вторым – вражеский космический корабль. Поскольку дисплей 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 единиц счета. Вы можете усовершенствовать этот проект игры “космическая гонка” на основе добавления в нее акселерометра или внести в нее любые другие изменения на ваш вкус.

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

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

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

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

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