Рендеринг 2D-карты в игре - обрезка и прокрутка - PullRequest
1 голос
/ 22 июня 2010

OK.В сущности, я пытаюсь сделать свою собственную интерпретацию оборудования NES, чтобы я мог создать игру, которая в идеале напоминала бы игру NES.В настоящее время я зациклен на том, как настроить рисование игрового поля в видеопамять (обратный буфер).

BACKBUFFER

У NES были ограничения на именуемую таблицу,или backbuffer.Для моего примера, размер буферного буфера составляет 256x240 пикселей, или размер одного экрана.Если бы я нарисовал это на телевизоре, он бы полностью заполнил экран.Теперь, если бы я нарисовал это на экране со смещением X = 5, все изображение было бы смещено и обернулось бы вокруг экрана.

Например .....

ORIGINAL, NO OFFSET:                      DRAWN WITH OFFSET OF X=5:
ABCDEFGHIJK                               GHIJKABCDEF

DRAWN WITH OFFSET OF X=-5:
FGHIJKABCDE

Экран разделен на квадраты 8x8 пикселей каждый, всего 32x30 строк и столбцов.(256х240 пикселей).Смещение представляется в пикселях, а не в столбцах;поэтому теоретически я мог бы сместить экран на 5 пикселей, и каждый столбец сместился бы вправо на пять пикселей.

ДИЗАЙН УРОВНЯ

Мои этапы составленыэкранов, содержащих данные, представленные в виде строк и столбцов размером 16x15, каждый размером 16x16 пикселей.Это делается для того, чтобы эмулировать, сколько игр уровня NES хранит данные об уровне - каждая плитка содержит информацию о том, что должно быть в каждом блоке 8x8.

Например:

AA
BC     with A,B,C,D representing what 8x8 graphic should go where

Этому также соответствует дизайн уровней.с каждым числом, являющимся отдельным экраном и - ничего не значащим, ноль.

-----
-123-
---4-
--54-
-----

РАЗМЕЩЕНИЕ ХАРАКТЕРОВ Это просто.Я уже знаю, как определить, к какой таблице, строке и столбцу относятся мои символы, основываясь на их абсолютном расположении.Я также могу определить относительное расположение на экране.

С помощью этой информации я могу легко определить, какие столбцы находятся слева и справа от символа, если таковые имеются (если символ находится слева отэкран 1, уровня больше не осталось)

ТАК ЗДЕСЬ ВОПРОС ДУН ДУН ДУН Как я рисую свои уровни на экране, чтобы они прокручивались от одного к другому.Было бы относительно легко рисовать один полный экран за раз, и когда персонаж подходит к краю, просто переворачивайте на другой экран.

Тем не менее, проблема, с которой я концептуально сталкиваюсь, заключается в том, что мне нужно «стримить»данные уровня на экране.Допустим, персонаж перемещается на 24 пикселя вправо.BG также должен двигаться.

Итак, мне нужно настроить прокрутку буфера в 24 пикселя.Однако простая прокрутка заставит экран перевернуться, обозначив старую часть уровня.Итак, при прокрутке я должен убедиться, что рисуем новые фрагменты уровня в задний буфер.Но прежде чем я смогу это сделать, мне нужно выяснить, какие плитки нужно рисовать в первую очередь.И если человек идет на 24 пикселя влево, мне нужно перерисовать плитки в буферном буфере и соответствующим образом изменить смещение.

И давайте не будем забывать, что если персонаж перемещается вправо и больше нет данных уровня длярисовать не должно быть смещения, но вместо этого персонаж становится ближе к краю экрана (вместо того, чтобы быть в центре экрана по оси X).

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

РЕДАКТИРОВАТЬ: Использование VB.Net.C # также применим (я программирую на обоих)

Ответы [ 2 ]

3 голосов
/ 23 июня 2010

То, как NES делал это, было с 4 таблицами имен, каждая 256x240.Когда вы прокручивали одну за пределы экрана, соседняя прокручивалась.Чтобы получить «миры» больше 512x480, вы обновляете таблицу имен в закадровых позициях.

Как правило, картридж имеет в ПЗУ гигантскую таблицу со всеми данными об уровне и отслеживает общееположение с 1 или 2 переменными ОЗУ.Затем, когда игра прокручивалась, она обновляла переменные ОЗУ, использовала их для поиска таблицы данных уровня и копирования новых данных уровня в части таблицы имен, которые были за кадром.

Таким образом, фактически ваш задний буфердолжно быть 512x480, и вы показываете только его часть 256x240.

Вы смотрели на разборку для любых игр NES с большими прокручивающимися мирами?Я думаю, что где-то есть частичная разборка Metroid ...

... да, нашел несколько документов на romhacking.net

Разборка Metroid ;не очень хорошо прокомментировано, но с небольшими усилиями это не должно быть слишком трудно понять.

Еще одна разборка , которая прокомментирована лучше.2-я разборка, опубликованная выше, посмотрите в MetroidGameEnginePage.txt процедуру «SetupRoom» и процедуру «DrawRoom»;также подпрограмма на этикетке LEB4D показывает, как обновляется таблица имен в одном случае.Также посмотрите на обширные комментарии над подпрограммой GetNameTable.В целом, текстовый поиск по «таблице имен» по всему документу даст вам гораздо больше.

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Также на romhacking.net; карта памяти для SMB может быть полезна.

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

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

...