Super Hexagon — инди-игра в жанре Action, разработанная Терри Кавана. В Super Hexagon игроку предстоит управлять небольшим треугольником, который может вращаться вокруг центрального шестиугольника (англ. Hexagon). Целью игры является избежание контакта треугольника с надвигающимися «стенами». Если игрок сталкивается с передней стороной одной из этих стен (касания боковых сторон разрешены), то игра заканчивается. После того, как игрок проиграет, ему покажут его время выживания за последнюю попытку, а также его лучшее время на этом уровне. Все рекорды отслеживаются на доске лидеров, на которой игроки могут просматривать рекорды своих друзей и мировые рекорды. У игры есть шесть уровней сложности: набор «нормальных» режимов — Hexagon, Hexagoner и Hexagonest — и набор «гипер»-версий предыдущих уровней, которые открываются после 60 секунд выживания в «нормальных» режимах.
Месторасположение стен различается на каждом уровне сложности. Стены закручены в «рукава» (секции повторяющихся стен), которые различаются при каждой попытке прохождения, заставляя игрока изучать как пройти каждый рукав, а не уровень целиком. «Гипер»-версии нормальных уровней содержат похожие рукава с небольшими вариациями, но рукава появляются быстрее, чем на обычных уровнях. Завершением игры считается выживание в течение 60 секунд на уровнях Hexagonest (нормальная концовка) или Hyper Hexagonest («настоящая» концовка). За завершение каждого уровня предусмотрены достижения в Steam, Game Center и Google Play Игры.
На ресурсе hackaday.io была найдена реализация этой замечательной игры. Мы конечно же незамедлительно решили перенести этот проект, на нашу плату VE-EP4CE10E.
Ядром всего проекта является модуль драйвера VGA. Это та часть дизайна , которая в конечном итоге будет отображать графику на экране. Для получения данные на экране был выбран конвейерный подход для расчета пикселей. На каждом пиксель клоке модуль драйвера VGA выводит координату x/y. Каждая координата затем проходит по конвейеру и обрабатывается до тех пор, пока цвет RGB не появится на выходе конвейера. Этот цвет затем подается обратно в модуль драйвера VGA. Ниже представлена упрощенная блок-схема:
Проблема, с которой я столкнулся во время разработки, заключалась в поиске способа, позволяющего убить игрока при столкновении с передней стеной, но все же позволяющего игроку перемещаться в стороны. Решение было достигнуто путем хранения старых и новых координат игрока. Если новая координата сталкивается, а старая нет, то позиция игрока возвращается к прежним координатам. Эта логика столкновения была встроена в основной игровой автомат:
Еще одна интересная часть проекта (Все было интересно!) это конвейер стен. В настоящее время активные стены хранятся в массиве 6bitx128 в оперативной памяти. Два указателя индексируют этот массив, один для того, чтобы стены двигались внутрь к игроку, а другой для того, чтобы обновлять стены новыми, когда они выходят из экрана. Новые стены будут получены (псевдо)случайным образом из набора из 16 предопределенных шаблонов. Пример такого шаблона приведен ниже:
Verilog Code:
walls_maze[0] = 6'b011111; walls_maze[1] = 6'b000000; walls_maze[2] = 6'b101111; walls_maze[3] = 6'b000000; walls_maze[4] = 6'b110111; walls_maze[5] = 6'b000000; walls_maze[6] = 6'b111011; walls_maze[7] = 6'b000000; walls_maze[8] = 6'b111101; walls_maze[9] = 6'b000000; walls_maze[10] = 6'b111110; walls_maze[11] = 6'b000000; walls_maze[12] = 6'b011111; walls_maze[13] = 6'b000000; walls_maze[14] = 6'b101111; walls_maze[15] = 6'b000000;
После того, как мы разобрались со стенами и игроком на месте, единственное, что осталось добавить сумасшедшее вращение и мигающие цвета, чтобы отвлечь игрока. Вращение было достигнут путем поворота начальных координаты X и Y путем умножения на SIN и COS. Изменение цвета осуществляется простым поиском в массив предопределенных цветов, основанных на том, присутствует ли стена, игрок или фон на каком-либо конкретном пикселе. Есть в общей сложности 4 цветовые схемы, которые меняются каждый раз, когда вращение становится немного быстрее.
Результат показан на следующем видео:
Проект игры Super Hexagon: SuperHexagonFPGA.zip