Спрайты 'Коммутации блоков' на старых приложениях NES

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

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

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

Другой пример поразил бы паузу в MM2. Мозаики BG перезаписываются во время паузы, и затем будьте восстановлены когда непаузы плеера. Как они помнили, какие мозаики они заменили и как восстановить их?

Если бы я был ленив, то я мог бы просто сделать один огромный статический битовый массив и просто захватить значения тот путь. Но я вынуждаю меня ограничить эти значения для создания более подлинного опыта. Я прочитал удивительное руководство по тому, как Дети Члена конгресса были сделаны, и я пытаюсь быть скелетами о том, как я программирую эту игру. Это все еще просто поражает, как эти программисты accomplisehd, что они сделали, с каким они имели.

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

9
задан Jeffrey Kern 13 June 2010 в 00:06
поделиться

1 ответ

wТак, после ночи размышлений и перечитывания документов, я думаю, что нашел идеальное решение. Матрица!

Учитывая следующие данные:

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

3
ответ дан 5 December 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: