«Банковское переключение» спрайты на старых приложениях NES

StackOverflow https://stackoverflow.com/questions/3030565

  •  26-09-2019
  •  | 
  •  

Вопрос

В настоящее время я пишу в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top