Программирование РЭШ - Nametables? - PullRequest
12 голосов
/ 10 июня 2010

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

По сути, из того, что я прочитал, каждый блок 8x8 в именованной таблице NES указывает на местоположение втаблица шаблонов, в которой хранится графическая память.Кроме того, таблица имен также имеет таблицу атрибутов, которая устанавливает определенную цветовую палитру для каждого блока 16x16.Они связаны между собой следующим образом:

(при условии 16 блоков 8x8) Nametable, с ABCD = указатели для спрайта данных:

ABBB
CDCC
DDDD
DDDD

Таблица атрибутов, с 1 2 3 = указатели наданные цветовой палитры, с <ссылочным значением слева, ^ вверху и 'слева и сверху: </p>

1<2<
^'^'
3<3<
^'^'

Таким образом, в приведенном выше примере блоки будут окрашены следующим образом:

1A 1B 2B 2B

1C 1D 2C 2C

3D 3D 3D 3D

3D 3D 3D 3D

Теперь, если у меня есть это на фиксированном экране - это прекрасно работает!Потому что разрешение NES составляет 256х240 пикселей.Теперь, как эти таблицы настраиваются для прокрутки?

Поскольку Nametable 0 может прокручиваться до Nametable 1, и если вы продолжите прокрутку, Nametable 0 снова будет отображаться.Это я получаю.Но я не понимаю, как прокрутить таблицу атрибутов.Из того, что я читал в Интернете, блоки 16x16, которым он назначает атрибуты, вызовут искажения цвета на краях экрана (как видно при прокрутке слева направо и наоборот в SMB3).

меня беспокоит то, что я понимаю, как прокручивать таблицы имен, но как прокрутить таблицу атрибутов?Например, если у меня есть зеленый блок в левой части экрана, перемещение экрана вправо должно теоретически привести к тому, что плитки справа также будут зелеными, пока они не переместятся в кадр, к которому они вернутся.их нормальные цвета.

~~~~ РЕДАКТИРОВАТЬ: Я хочу отметить, что я знаю о линиях сканирования, X и Y. Эта мысль только что пришла мне в голову.

Допустим, я на ScanlineY из 10. Это означает, что я читаю 10 значений в мои таблицы имен по горизонтали.Это означало бы, что мой первый столбец находится за пределами экрана, поскольку его ширина пикселя равна 8. Однако атрибут цвета остается, поскольку он имеет ширину 16.

Предполагается, что атрибут цвета для всего столбца имеет значениезеленый, я был бы прав, предполагая, что для пользователя первые 6 пикселей в левой части экрана будут окрашены в зеленый цвет, а самые правые 10 на экране также должны быть зелеными?Итак, я был бы прав в своем предположении, что в соответствии с экраном, слева?

Ответы [ 5 ]

2 голосов
/ 11 июня 2010

Этот сайт Я уверен, что вы уже очень, очень хорошо знакомы.Я предвосхищу это, сказав, что я никогда не программировал для NES, но я очень опытен со всем аппаратным обеспечением Gameboy, которое когда-либо было выпущено, и NES разделяет многие ухмылки с GB / DMG.Держу пари, что вам нужно сделать одно из следующих действий:

  1. Не прокручивайте таблицу атрибутов.Убедитесь, что все ваши уровни имеют похожие цветовые блоки вдоль направления движения.Я предполагаю, что многие игры первого поколения сделали это.

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

  3. Достаньте свой старый таймер skool atari 2600 и назначьте время записи для регистрации $ 2006 в конце обновления HBlank, чтобы получить замену цветавам нужно сделать, подождать несколько тиков, а затем вернуться в течение периода возврата HBlank, чтобы левый край следующей строки не пострадал.Я чувствую, что это решение используется чаще всего, но без действительно хорошего эмулятора и терпения, это будет боль в заднице.Это также немного повлияет на общее использование процессора, так как вам придется ждать прерываний на нескольких строках сканирования, чтобы добиться эффекта.

Мне бы хотелось получить более конкретный ответ дляВы, но это, надеюсь, поможет немного.Слава богу, у GB / DMG была немного более продвинутая система прокрутки.:)

1 голос
/ 30 декабря 2010

Каждая таблица имен имеет свою собственную таблицу атрибутов, поэтому при прокрутке от одной таблицы имен к другой не должно быть графических артефактов.Тип цветового глюка, на который вы ссылаетесь, действительно является проблемой, если ваша игра прокручивается как по вертикали, так и по горизонтали.У вас есть только две таблицы имен, поэтому для прокрутки в обоих направлениях требуется каннибализация видимого экрана.Существуют различные решения этой проблемы, отличное резюме которых можно найти в этом посте nesdev:

http://nesdev.parodius.com/bbs/viewtopic.php?p=58509#58509

1 голос
/ 12 июня 2010

Super Mario Bros. 3 и Kirby's Adventure отображают цветные артефакты на краю экрана при прокрутке. Я полагаю, что обе игры устанавливают бит, закрывающий левые 8 пикселей экрана, поэтому на любом одном кадре будут затронуты 0-8 пикселей.

Если я правильно помню, Kirby's Adventure всегда старается разместить проколотые столбцы на боковой стороне прокручиваемого экрана, чтобы сделать его менее заметным. Я не думаю, что эти артефакты можно предотвратить без переключения на вертикальное зеркалирование, что само по себе создает трудности.

Отказ от ответственности: прошло уже пять лет с тех пор, как я написал код NES.

0 голосов
/ 30 июля 2012

Каждая таблица имен имеет свою собственную таблицу атрибутов.Если вы ограничите свой игровой мир только двумя экранами, вам нужно будет написать таблицы имен и атрибутов только один раз.Трудная часть приходит, когда вы пытаетесь сделать миры больше двух экранов.Super Mario Bros. 1 сделал это путем прокрутки вправо, обтекания по мере необходимости и рендеринга столбца первого уровня за раз (16 пикселей) непосредственно перед тем, как этот столбец появился на виду.Я не знаю, как можно было бы эффективно это кодировать (имейте в виду, что у вас есть только миллисекунда времени vblank).

0 голосов
/ 11 июня 2010

Этот сайт может помочь. http://www.games4nintendo.com/nes/faq.php#4

(Ищите «Что с $ 2005/2006?» И начинайте читать в этой области.)

По сути, кажется, что невозможно сделать его идеальным пикселем, однако это будут те биты, которые вам, вероятно, понадобятся для изучения.

Хотелось бы мне больше помочь.

...