Подтвердить что ты не робот

Программирование NES - Напоминания?

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

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

(предполагая 16 8x8 блоков) Nametable, с A 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, если у меня есть зеленый блок в левой части экрана, перемещение экрана вправо должно теоретически приводить к тому, что плитки справа должны быть зелеными, пока они больше не перейдут в рамку, к которой они вернутся их нормальные цвета.

~~~~ EDIT: Я хочу отметить, что я знаю о сканированных линиях X и Y. Эта мысль просто пробежала мой разум.

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

(Найдите "Что за $2005/2006?" и начните читать по этой области.)

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

Жаль, что я не смогу помочь.

Ответ 5

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