Рендеринг 2D-карта в игре - обрезки и прокрутка

StackOverflow https://stackoverflow.com/questions/3088687

  •  28-09-2019
  •  | 
  •  

Вопрос

ХОРОШО. Я в Essense пытаюсь сделать свою собственную интерпретацию оборудования NES, поэтому я могу сделать игру, которая в идеале будет напоминать, как будет выглядеть игра NES. В настоящее время я застрял в том, как настроить, как нарисовать Playfield в видео памяти (Back Buffer).

Backbuffer

NES имел ограничения на именуемых или загибоченных. Для моего примера, задняя часть имеет 256x240pixels, или размер одного экрана. Если бы я привлек это к телевизору, это идеально заполнило бы экран. Теперь, если я привлек это на экране с смещением x = 5, все изображение будет смещено и обертится вокруг экрана.

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

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

DRAWN WITH OFFSET OF X=-5:
FGHIJKABCDE

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

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

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

Например:

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

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

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

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

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

Итак, вот вопрос Dun Dun DunКак я могу нарисовать свои уровни на экран, чтобы они прокручивались от одного к следующему. Было бы относительно легко нарисовать один полный экран одновременно, и когда персонаж попадает в край, просто переверните на другой экран.

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

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

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

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

Редактировать: Использование vb.net. C # также применим (я программирую в обоих)

Это было полезно?

Решение

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

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

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

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

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

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

Еще одна разборка это прокомментировано лучше.

РЕДАКТИРОВАТЬ: Во 2 -й разборке, опубликованной выше, посмотрите на MetroidGameEnginePage.txt на рутине SetUproom и в рутине «Граза»; Также подпрограмма в Label LEB4D показывает, как таблица имен обновляется в одном случае. Также посмотрите на обширные комментарии выше «Getnametable» рутины. В целом, текстовый поиск «Таблица имен» на протяжении всего документа даст вам гораздо больше.

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top