«Банковское переключение» спрайты на старых приложениях NES
Вопрос
В настоящее время я пишу в C # Что в основном можно назвать моей собственной интерпретацией оборудования NES для старой школы, которую я разрабатывающую. Я выпустил FCE и наблюдал за тем, как отображаются NES и отображаемая графика.
В двух словах, NES может удерживать две растровые рамки графической информации, каждый с размерами 128x128. Они называются таблицами PPU. Один был для плиток BG, а другой был для спрайтов. Данные должны были быть в этой памяти, чтобы она была нарисована на экране. Теперь, если в игре было более графические данные, то эти два банка, она могла писать части этой новой информации этим банкам - перерапите, что там было - в конце каждого кадра и использовать его из следующего кадра.
Итак, в старых играх, как банковский коммутатор программистов? Я имею в виду в рамках дизайна уровня, как они узнали, какой графический набор нагрузки? Я заметил, что Mega Man 2 Bankswitches, когда экран программически прокручивается от одной части сцены к следующему. Но как они хранят эту информацию на уровне - какие спрайты копируют в таблицы PPU, а где их писать?
Другим примером будет ударить паузу в MM2. Плитки BG получите перевернутую во время паузы, а затем восстанавливаются, когда игрок запускает. Как они помнили, какие плитки они заменили и как их восстановить?
Если бы мне ленил, я мог бы просто сделать один огромный статический растровый карту и просто захватить ценности таким образом. Но я заставляю себя ограничивать эти ценности, чтобы создать более подлинный опыт. Я прочитал удивительное руководство по тому, как были сделаны дети MC, и я пытаюсь быть босыми о том, как я программирую эту игру. Это все еще просто укрепляет мой разум, как эти программисты делают, что они сделали с тем, что они имели.
Отредактируйте: Единственное решение, которое я могу подумать, о том, чтобы держать отдельные таблицы, которые указывают, какие плитки должны быть в PPU в какое время, но я думаю, что это будет огромный ресурс памяти, который не сможет справиться.
Решение
WSO после ночи мышления и повторного чтения документов, я думаю, что я придумал идеальное решение. Матрица!
Учитывая следующие данные:
3, -1, -1, -1, -1
-1, 0, 1, 2, -1
-1, -1, -1, 3, -1
-1, -1, 5, 4, -1
-1, -1, -1, -1, -1
Я могу использовать эту информацию для доступа к информации в таблицах поиска, чтобы определить, какую информацию мне нужно. Первая запись (0,0) определяет всю карту, где, как и другие значения, определяют то, что необходимо в этом конкретном экране.
MAP ARRAY PALETTE MUSIC TILESET STARTINGSCR
0 0 0 1 4
1 4 3 2 2
2 etc.
3
Поэтому при загрузке карты я смотрю на элемент (0,0). Это скажет, что мне нужно загрузить X плитки в PPU, используйте Y Color Pallete, Z Tiletet и музыку. Также он также скажет, что экран 0 является исходным экраном, и этот уровень запускается там - позиционируйте характер соответственно.
SCREEN PALETTE TILESET MUSIC TILEDATA SCROLLL SCROLLR SCROLLU SCROLLD
0 0 1 2 4 true true true true
1 etc
2 2 1 2 3 false false false true
Теперь давайте скажем, мне нужно переходные экраны. Я могу посмотреть на текущий экран против целевого экрана. Если новый экран нуждается в информации, не в PPU, я могу запустить переход, который загрузит данные во время этого. Я также могу посмотреть, смогу ли я прокрутить в это направление; Например, если целевой экран --1, я не могу прокрутить это направление. Я также могу хранить флаг куда-то, чтобы определить, что при прокрутке на этот экран я не могу прокрутить обратно. Например, я могу идти прямо на экран № 2, но не может прокрутить слева на экране 1.