back..

Cassandra

powered by NES JSNES

View on GitHubSource Code

DPad: WASD | Select: Space | Start: Return | A: E | B: F

DEVLOG

Часть четвёртая. Коллизии.


TODO

Часть третья. Про обработку ввода.


Вернулся к разработке игры для NES. Давно пора освежить свои познания в устройстве этой платформы и заставить спрайт персонажа перемещаться по экрану.

Для начала нужно разобраться с тем, как считывать состояние контроллера.

Чтобы начать считывание, сначала необходимо записать в регистр 0x4016 (адрес Latch-порта) значение "1", а после этого сразу же "0" - это зафиксирует текущее состояние кнопок, которые затем можно будет прочитать из следующих портов:

  • 0x4016 - для первого игрока;
  • 0x4017 - для второго игрока;
Распиновка порта контроллера для NES
(источник: https://www.raspberryfield.life/2018/09/01/nespi-project-part-4-the-nes-controller-protocol/)

Читать стостояние кнопок можно только по отдельности - для полного чтения всех восьми кнопок необходимо восемь раз запросить чтение из регистра.

Состояние кнопок хранится в таком порядке: 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 позволит мне красочно воплотить все мои задумки, однако по итогу дня я набросал простенький прототип в чёрно-белых тонах: