Программирование NES - Nametables?

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

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

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

ABBB
CDCC
DDDD
DDDD

Таблица атрибутов, с 1 2 3 = указатели на данные цветовой палитры, с <ссылающийся на значение налево, ^ выше, и 'налево и выше:

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

Так, в примере выше, блоки были бы окрашены как так

1A 1B 2B 2B

1C 1D 2C 2C

3D 3D 3D 3D

3D 3D 3D 3D

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

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

Беспокойство, которое я имею, - то, что я понимаю, как прокрутить nametables, но как Вы прокручиваете таблицу атрибутов? Для intsance, если у меня есть зеленый блок на левой стороне экрана, перемещая экран для исправления, должен в теории вызывать мозаики к праву быть зеленым также, пока они не перемещаются больше в кадр, к которому они вернутся к своим нормальным цветам.

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

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

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

12
задан Jeffrey Kern 9 June 2010 в 23:47
поделиться

3 ответа

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

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

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

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

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

2
ответ дан 2 December 2019 в 23:42
поделиться

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

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

Оговорка: прошло около пяти лет с тех пор, как я писал код для NES.

1
ответ дан 2 December 2019 в 23:42
поделиться

Этот сайт может быть полезен. http://www.games4nintendo.com/nes/faq.php#4

(Наберите в поисковике "What's up with $2005/2006?" и начните читать с этого места)

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

Хотел бы я быть более полезным.

0
ответ дан 2 December 2019 в 23:42
поделиться