Спрайты "переключения банка" на старых приложениях NES

в настоящее время я пишу на C#, что в основном можно назвать моей собственной интерпретацией оборудования NES для старой школы, которую я разрабатываю. Я запустил FCE и наблюдал, как NES отображал и визуализировал графику.

в двух словах, NES может содержать два растровых изображения графической информации, каждый с размерами 128x128. Они называются таблицами PPU. Один был для плиток BG, а другой-для спрайтов. Данные должны быть в этом память для того, чтобы он был нарисован на экране. Если бы в игре было больше графических данных, чем в этих двух банках, она могла бы записать в эти банки часть новой информации-перезаписать то, что там было, - в конце каждого кадра и использовать ее со следующего кадра.

Итак, в старых играх, как программисты "банк переключаются"? Я имею в виду, в рамках дизайна уровня, как они узнали, какой графический набор для загрузки? Я заметил, что Mega Man 2 bankswitches, когда экран программно прокручивается из от одной части сцены к другой. Но как они хранили эту информацию на уровне-какие спрайты копировать в таблицы PPU и где их записывать?

другой пример-о паузе в мм2. Плитки BG переписываются во время паузы, а затем восстанавливаются, когда игрок отключается. Как они запомнили, какие плитки они заменили и как их восстановить?

Если бы я был ленив, я мог бы просто сделать одно огромное статическое растровое изображение и просто захватить значения, которые путь. Но я заставляю себя ограничить эти ценности, чтобы создать более аутентичный опыт. Я прочитал удивительное руководство о том, как были сделаны дети M. C., И я пытаюсь быть голым о том, как я программирую эту игру. Меня до сих пор поражает, как эти программисты делают то, что они сделали с тем, что у них было.

EDIT: единственное решение, которое я могу придумать, - это провести отдельные таблицы, в которых указано, какие плитки должны быть в PPU в какое время, но я думаю, что это будет огромная память ресурс, с которым NES не сможет справиться.

1 ответов


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 tileset и музыку. Он также скажет, что экран 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.