Designed and maintained by Lennart Steinke
перевод - Aidamir Taimasukov aidamir@chat.ru
Предисловие
-----------
Я полагаю, вы знаете, что такое мир построенный на тайлах, но для того чтобы удостовериться, что мы используем тот же самую терминологию, я сделаю краткое введение и определение терминов.
На растровом уровне, каждый пиксел - это индекс к соответствующему цвету в палитре. На уровне тайловой карты, каждый тайл из карты - индекс к соответствующей клетке в вашем архиве тайлов (который может быть массивом или списком связей). Это подобно текстовым режимам, в которых, помещая одиночный байт (или фактически два байта, один для атрибута) выводится символ на экран.
Тайл непосредственно - только растр определенного размера. Основная идея состоит в том, чтобы сделать дисплей более абстрактным. Вместо экранной памяти фиксированного размера, Вы получаете Тайловую Карту виртуального размера, которого Вы хотите.
Отлично, что с этим делать?
---------------------------
Помните старую игру "pacman"? Это - лабиринт, заполненный пирогами, игрок должен есть их избегая того, чтобы быть съеденным четырьмя призраками, которые преследуют его. Вы могли бы реализовать графику, рисуя лабиринт графическим редактором, но затем вы столкнетесь с проблемами, как только Вы захотите проверять столкновения со стенками, пирогами и всем другим в лабиринте.
Вы могли бы предложить такой путь использования ТК: лабиринт построен из нескольких блоков (прямые строки и углы), пироги всегда одинаковые, и они одинаково возможно ограничивают движение спрайтов при перемещении из клетки в клетку. Проверка стенок и пирогов проста: Только проверьте ТК, если индекс указывает на стенку, или пирог.
Jump'n'Run игры - также отличное место, чтобы использовать тайлы: целый мир состоит из некоторых элементов (платформы, стенки, многозвенные схемы, телепортеры и т.д.), использование тайлов решительно уменьшит необходимый объем памяти. И еще раз, проверка столкновений со стенками - намного проще чем на растровом уровне.
Вывод на дисплей
----------------
Сперва, зададим некоторые константы:
#define TILE_WIDTH 16
#define TILE_HEIGHT 16
#define TILE_COUNT_X SCREEN_WIDTH / TILE_WIDTH
#define TILE_COUNT_Y SCREEN_HEIGHT / TILE_HEIGHT
Выбран размер 16x16 для тайлов, но Вы могли бы также использовать 10x10, 32x32, 20x15, 32x10 и т.д. Размер тайлов зависит только от того, что Вы хотите делать с ними. Следующие две константы содержат число тайлов, которые показывают полное число строк и колонок видимых на экране. Вывод видимой части карты на экран прост:
bitmap *tile[100]; /* 100 tiles */
unsigned char map[MAP_WIDTH][MAP_HEIGHT]; /* The map */
for (y=0; y < TILE_COUNT_Y; y++)
for (x=0; x < TILE_COUNT_X; x++)
blit_tile(x*TILE_WIDTH, y*TILE_WIDTH, tile[map[x][y]]);
Blit_tile (x, y, tile *n) вывод тайла n в позицию (x, y) .. Ваша gfx lib должна иметь функцию вывода прямоугольных областей на экран.
Скроллинг
---------
Чтобы получить гладкую прокрутку tilebased- мира, нужны дополнительные усилия . Прежде всего мы нуждаемся в двойном буфере (это вообще не необходимо, но это делает прокрутку мира намного проще -и быстрее) с шириной screensize +
2*tile_width и высотой screenheight + 2*tile_height.
lennart_steinke@bigfoot.com
|