[Из песочницы] Игра-подобие Pacman на STM32F429I-DISCO с редактором карт
Видео для привлечения внимания [embedded content]В двух словах о себе Студент почти уже 4 курса факультета ПМ-ПУ Санкт-Петербургского государственного университета, с 1 курса потихоньку программирую на C/C++, около полугода назад стал поглядывать в сторону Java (огромное спасибо проекту JavaRush!). Регулярно цепляют новые темы для изучения: в рамках диплома занимаюсь обработкой изображений, также мучаю Qt, успел повозиться с машинным обучением, сделать проект на Ruby on Rails, а сейчас начинаю копаться в распознавании речи.И вот однажды я понял, что мне хочется попробовать поработать с «железом». Долгие поиски в интернете и раздумья привели меня к тому, что я решился разбираться с ARM процессорами. Аргументами в пользу этого стало также и то, что в обозримом будущем, когда появятся свободные деньги, мне бы хотелось прицепить ко всему этому камеру и дисплей — мощность ARM вполне позволит мне это сделать.
Знакомство с железом Мой выбор пал на семейство STM32. Подумав, что с парой светодиодов я быстро наиграюсь, а вот с экранчиком уже можно вдоволь поразвлекаться, я заказал себе STM32F429I-DISCO. Будучи ужасно разочарованным всеми питерскими магазинами, которые продают нужное мне железо, я все-таки получил заветную плату. Около недели разбирался с основами, радуясь каждому мигающему светодиоду или заработавшей функции. О, смотри, я жму на кнопку и лампочка перестает мигать!
— от автора «Ух ты, мигают сразу две лампочки!» и «Ух ты, мигают сразу две лампочки с разной скоростью! «Затем был и гироскоп, и дисплей, всякого рода счетчики/таймеры/секундомеры, знакомство с FreeRTOS, но это уже другая история.Pacman, собственной персоной Немного освоившись, появилось желание сделать что-нибудь интересное. Сразу подумал про написание игры. Поначалу думал о платформере, но решил сделать игру чуть попроще — некое подобие Pacman. Выбрал для себя путь «от простого к сложному» — сначала напиши самое основное, потом постепенно добавляй фичи. Вот уже и карта отрисовывается, наш Pacman бегает по карте, даже сквозь стены не проходит! К этому моменту у меня в голове сложился минимум, который я бы хотел реализовать: Основной функционал — бегать и кушать; Наличие вражины, злостно мешающей нам жиреть скушать все; Возможность управлять передвижениями как с помощью гироскопа, так и с тачскрина; Возможность редактировать настройки (как минимум выбирать тип управления); Возможность редактировать карту. Перемещение Движение по карте реализовано самым простым, пожалуй, способом: движутся все одновременно и с одной скоростью. Игровое поле рассматривается как сетка размером 19×21 клеток. При каждой итерации функция, отвечающая за движение, имеет информацию о текущем местоположении объектов и желаемом направлении движения игрока. Затем проверяется, может ли игрок переместиться в следующую клетку в желаемом направлении. После этого определяется направление движения вражины и проверяется, столкнутся ли игрок и вражина. Условия столкновения при такой модели движения очень просты — либо игрок и вражина находятся в одной клетке, либо они в соседних клетках и собираются двигаться навстречу друг другу.Злобная вражина Сначала я подумал сделать самую простую логику принятия решений: игрок выше вражины — вражина идет вверх, игрок левее вражины — вражина идет влево и т.д. Эта идея работала соответственно своей простоте — вражина безнадежно застревала в углах, позволяя выедать большие участки карты без всякого сопротивления. Попытки вывести вражину из этого состояния рандомными движениями не увенчалась успехом. Полностью рандомные движения вызывали стойкое желание вызвать скорую помощь мучающейся от припадка вражине. Одна идея работала более-менее сносно — случайный выбор направления движения на каждой развилке (между развилками — в выбранном направлении по прямой, без отклонений).Возможно, стоило совместить эту идею с самой первой, но мною было принято решение более не пытаться изобрести велосипед, а воспользоваться старым добрым волновым алгоритмом Ли. После его реализации все стало просто замечательно. Даже слишком замечательно — сложность игры стала довольно высока, ведь вражина выбирает теперь самый короткий путь. Решил пока оставить все как есть. Только количество вражин увеличивать не стал (их в классическом Pacman 4).
Настройки С настройками все довольно просто. Очевидно, реализована возможность выбора типа управления. Управление тачскрином реализовано с помощью зонирования экрана:
Верхняя/нижняя зона порой казалась мне довольно маленькой — при активной игре мне порой хотелось, чтобы эти зоны были поближе к центру экрана. Поэтому в настройки вынес увеличение/уменьшение этих зон. Для визуализации изменений решил сделать черточки с краю экрана. Небольшая странность в поведении библиотечных функций работы с дисплеем: если отображаемый объект вылезает за правую границу экрана — остаток появляется слева. А я немного ошибся в длине самой первой отрисовки черточки, что дало интересный побочный эффект — черточка в итоге двигалась как надо, но на экране оставались 2 пикселя, с левой и правой стороны экрана, обозначавших положение черточки на момент открытия настроек. Решив, что эффект интересный, но не очевидный для пользователя, сделал все как положено. Негоже чтобы что-то было похоже на баг.
Проблемы, возникшие в ходе написания игры Остальные проблемы, на мой взгляд, не требуют подробного описания, поэтому вкратце: Разбираясь с тачскрином, заметил «дребезг» точки касания — разброс регистрируемых касаний ~2–3 мм с редкими скачками. Сам дребезг практически не доставляет проблем (разве что в редакторе), а вот редкие скачки не очень радуют.
Код А вот он, на гитхабе лежит. Немного приведен в порядок, но далек от идеала.Планы на будущее Неплохо бы переделать систему перемещений, поскольку в текущем виде она не позволяет менять скорость врагов и игрока относительно друг друга. После этого чуть замедлить врагов и реализовать их поближе к оригинальному Pacman.