Прежде всего, позвольте мне сказать, что 2D RPG близки и дороги моему сердцу и работают со старыми движками DX7 VB6 MORPG (не смейтесь, это было 8 лет назад, сейчас :-)) - это то, что впервые заинтересовало меня в разработке игр , Совсем недавно я начал конвертировать игру, над которой работал на одном из этих движков, для использования XNA.
Тем не менее, я рекомендую использовать для вашей карты структуру на основе плиток с наложением слоев. С любым графическим API, который вы используете, у вас будет ограничение на размер текстур, которые вы можете загрузить. Не говоря уже об ограничениях памяти текстуры видеокарты. Итак, учитывая это, если вы хотите максимизировать размер ваших карт, не только минимизируя количество и размер текстур, которые вы загружаете в память, но и уменьшая размер ваших ресурсов на жестком диске пользователя И время загрузки, вы определенно захочется пойти с плитками.
Что касается реализации, я подробно рассказал о том, как я справился с этим, по нескольким вопросам здесь, в GameDev.SE и в моем блоге (оба ссылки ниже), и это не совсем то, что вы спрашиваете, поэтому я просто перейти к основам здесь. Я также отмечу особенности плиток, которые делают их полезными при загрузке нескольких больших предварительно отрендеренных изображений. Если что-то не понятно, дайте мне знать.
- Первое, что вам нужно сделать, это создать лист плиток. Это просто большое изображение, которое содержит все ваши плитки, выровненные в сетке. Это (и, возможно, дополнительный в зависимости от количества плиток) будет единственное, что вам нужно загрузить. Всего 1 изображение! Вы можете загрузить по 1 на карту или по одному на каждую клетку в игре; какая организация работает для вас.
- Далее вам нужно понять, как вы можете взять этот «лист» и перевести каждую плитку в число. Это довольно просто с простой математикой. Обратите внимание, что деление здесь является целочисленным делением , поэтому десятичные разряды отбрасываются (или округляются вниз, если вы предпочитаете).
Хорошо, теперь, когда вы разбили лист плиток на ряд ячеек (чисел), вы можете взять эти числа и вставить их в любой контейнер, который вам нравится. Для простоты вы можете просто использовать 2D-массив.
int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
Далее вы хотите нарисовать их. Один из способов сделать этот LOT более эффективным (в зависимости от размера карты) состоит в том, чтобы вычислять только те ячейки, которые в данный момент просматривает камера, и проходить через них. Вы можете сделать это, выбрав координаты массива мозаики карты в верхнем левом ( tl
) и нижнем правом ( br
) углах камеры . Затем выполните цикл от tl.X to br.X
и, во вложенном цикле, от, tl.Y to br.Y
чтобы нарисовать их. Пример кода ниже:
for (int x = tl.X; x <= br.X;x++) {
for (int y = tl.Y; y <= br.Y;y++) {
//Assuming tileset setup from image
Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
//Draw 32x32 tile using tilesetCoordinate as the source x,y
}
}
- Джек-пот! Это основы движка плитки. Вы можете видеть, что легко иметь даже карту 1000x1000 без особых накладных расходов. Кроме того, если у вас меньше 255 фрагментов, вы можете использовать байтовый массив, сокращая объем памяти на 3 байта на ячейку. Если байт слишком мал, для ваших нужд, вероятно, подойдет ushort.
Примечание: я пропустил концепцию мировых координат (на которой будет основана позиция вашей камеры), так как это, я думаю, выходит за рамки этого ответа. Вы можете прочитать об этом здесь на GameDev.SE.
Мои ресурсы Tile-Engine
Примечание: все они нацелены на XNA, но это в значительной степени относится ко всему - вам просто нужно изменить вызовы отрисовки.
- Мой ответ на этот вопрос обрисовывает в общих чертах, как я обращаюсь с ячейками карты и наслоением в моей игре. (Смотрите третью ссылку.)
- Мой ответ на этот вопрос объясняет, как я храню данные в двоичном формате.
- Это первое (ну, технически второе, но первое «техническое») сообщение в блоге о разработке игры, над которой я работал. Вся серия содержит информацию о таких вещах, как пиксельные шейдеры, освещение, поведение листов, движение и все эти забавные вещи. Я фактически обновил пост, добавив в него содержание моего ответа по первой ссылке, которую я разместил выше, поэтому вы можете вместо этого прочитать ее (возможно, я что-то добавил). Если у вас есть какие-либо вопросы, вы можете оставить комментарий там или здесь, и я буду рад помочь.
Другие Ресурсы Плитки
- Учебник по движку плиток с этого сайта дал мне основу, которую я использовал для создания своих карт.
- На самом деле я еще не смотрел эти видеоуроки, потому что у меня не было времени, но они, вероятно, полезны. :) Они могут быть устаревшими, если вы используете XNA.
- На этом сайте есть еще несколько учебных пособий, которые (я думаю) основаны на приведенных выше видео. Возможно, стоит проверить.