Часть четвёртая. Коллизии.
TODO
powered by JSNES
DPad: WASD | Select: Space | Start: Return | A: E | B: F
TODO
Вернулся к разработке игры для NES. Давно пора освежить свои познания в устройстве этой платформы и заставить спрайт персонажа перемещаться по экрану.
Для начала нужно разобраться с тем, как считывать состояние контроллера.
Чтобы начать считывание, сначала необходимо записать в регистр 0x4016
(адрес Latch-порта) значение "1", а после этого сразу же "0" - это зафиксирует текущее состояние кнопок, которые затем можно будет прочитать из следующих портов:
0x4016
- для первого игрока;0x4017
- для второго игрока;Читать стостояние кнопок можно только по отдельности - для полного чтения всех восьми кнопок необходимо восемь раз запросить чтение из регистра.
Состояние кнопок хранится в таком порядке: A, B, SELECT, START, UP, DOWN, LEFT, RIGHT
При чтении из регистра необходимо фильтровать данные. Помимо состояния кнопки, в прочитанном байте присутствует и некоторая другая информация. Бит указывающий на состояние кнопки - это первый бит (0b00000001). Ненужные данные можно отсечь операцией AND (*0x4016 & 0b00000001).
По окончанию дня удалось заставить спрайт персонажа двигаться. Теперь необходимо каким-то образом добавить коллизии и нарисовать графику для разных направлений взгляда.
Пожалуй, стоит подробнее поведать про технические ньюансы.
Наиболее остро чуствуется ограничение на максимальное количество цветов в палитре. Для рисования графики я могу использовать лишь 3 цвета (не считая цвет фона) и для того, чтобы объекты с таким скудным набором цветов не сливались друг с другом, мне приходится жертвовать ещё одним оттенком для создания обводки. Невероятно кропотливое занятие, но такая борьба с ограничениями железа заставляет проявлять креативность в некоторых моментах.
Изначально я нарисовал объекты в комнате в виде спрайтов, но тут же столкнулся с невозможностью графического чипа NES отрисовывать более 8 спрайтов в одной строке. По этой причине мне пришлось убрать их на задний план, дорисовав им недостающий фон в виде пола и стен.
Так же я заранее думаю над тем, как уместить как можно большее количество графики в минимальное пространство на чипе. Как выяснилось, один из способов сжать графику - отразить и переиспользовать один и тот же тайл дважды.
Если внимательно взглянуть на изображение кровати, то можно заметить, как одна и та же деталь играет роль зазора в деревянном полу и ручки дверцы одновременно.
Я неоднократно перерисовывал тумбочку таким образом, чтобы она специально подходила к соседнему тайлу. Теперь я могу переиспользовать тайл нижней части тумбочки, просто дав комманду PPU отрисовать его в отзеркаленном виде с двух сторон. Удалив по такому принципу все одинаковые тайлы, я смогу ужать изображение с 16 до 9 частей и освободить место под целых 7 новых элементов графики.
Куда нагляднее этот процесс продемонстрирован в видео Morphcat Games (объяснение на 4:18)
На днях я откопал свои тестовые наброски для NES и захотел сделать на их основе что-то играбельное.
Мне чертовски нравятся квесты с хоррорной составляющей и я давно мечтаю создать игру в этом жанре. Решил черпать вдохновение из таких проектов, как Yume Nikki, IB и отдельно двух любопытных крипипаст - Petscop и Killswitch. Меня привлекает идея якобы потерянных и невышедших игр с жуткой предысторией, а учитывая, что железу NES уже более 30 лет, то из этого может получиться что-то интересное.
Конечно вряд ли старушка NES позволит мне красочно воплотить все мои задумки, однако по итогу дня я набросал простенький прототип в чёрно-белых тонах: