четверг, 15 декабря 2011 г.

[Slick] Статья номер 5. Работа с картами формата программы TileD

Работа с картами формата программы TileD

TileD - это редактор карт, доступный по адресу: http://www.mapeditor.org/. На данный момент доступна старая версия, написанная на Java (больше не поддерживается) и новая версия, основанная на Qt.




Slick поддерживает загрузку и отображение ортогональных карт, созданных в программе  TileD.

Класс TiledMap позволяет как загружать карту,  так и отображать её на экране. Загрузка карты не сложнее загрузки картинки или звука. Достаточно просто создать экземпляр, указав в конструкторе ссылку на файл, в котором хранится карта. Формат карты (XML) позволяет хранить относительный путь к файлу с набором плиток (картинок-элементов карты). В конструкторе класса TiledMap() есть возможность первым параметром передавать путь к карте в формате XML, а вторым - путь к графическим файлам, хранящих изображения отдельных плиток.
Предположим, что все ресурсы (карты и картинки) в нашем проекте хранятся в каталоге "res", тогда вызов конструктора будет иметь следующий вид:

TiledMap map = new TiledMap("res/testmap.tmx","res");

Теперь, чтобы вывести всю карту на экран, необходимо выполнить следующее:

map.render();

Или, если необходимо вывести только часть карты, методу render() необходимо передать несколько дополнительных параметров:

// render(int x, int y, int sx, int sy, int width, int height)
map.render(100,100,0,0,10,10);

Вызов этого метода выведет часть карты в тайловых координатах от 0, 0 до 10, 10 на экран по координате 100, 100. Такая возможность очень полезна в плане повышения производительности, когда карта выводится не полностью, а производится перемещение небольшого окна по большой тайловой карте.

Есть возможность выводит карту "построчно". Это необходимо, например, чтобы вывести персонаж внутри карты, между выводами отдельных строк карты. Например, вы можете захотеть вывести своего персонажа перед объектами, размещёнными на выше по оси Y и, таким образом, персонаж будет спрятан за каким-либо объектом.

Для того, чтобы появилась возможность выполнять свой вывод между выводом строк карты, вы должны создать свой класс, унаследовав его от TiledMap и переопределить метод renderedLine(). Данный метод всего лишь уведомление о том, что была отрисована одна строка карты, то есть, в этом методе можно поместить код вывода на экран спрайта персонажа или другого элемента.

В файле TileMapTest.java приведён пример вывода карты.

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

Класс TiledMap из библиотеки Slick даёт вам возможность занести в свойства данной локации те свойства, которые были присвоены ей в редакторе Tiled (то есть, при редактировании карты). Данный процесс состоит из двух этапов. Для начала мы должны определить тип тайла, используемого для отображения в данной локации:

// getTileId(int x, int y, int layerIndex)
int tileID = getTileId(10,10,0);

Таким методом мы получаем тип тайла, выводимого в позиции 10, 10 на уровне 0. Затем мы можем использовать этот тип чтобы определить связанный с ним набор метаданных таким образом:

// getTileProperty(int tileID, String propertyName, String def)
String blocked = getTileProperty(tileID, "blocked", "false");

Примечание: мы можем указать значение по умолчанию, которое будет возвращено, если запрошенное свойство не определено для данного типа тайлов. Например, таким образом мы можем сделать процесс преобразования более опрятным:

boolean blocked = "true".equals(getTileProperty(tileID, "blocked", "false"));

Таким образом мы гарантируем, что значение будет возвращено в любом случае.

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

Примечание. На данный момент Slick поддерживает только карты, созданные из тайлов, у которых в графическом файле содержится только одна картинка, а не набор картинок (так называемый тайлсет или атлас). Можно пользоваться несколькими тайлсетами, но каждый из них должен содержать не больше одной картинки тайла.

Подробно о создании игры с использованием карт формата Tiled описано по этой ссылке.

Источник: сайт Wiki-документации проекта Slick: http://slick.cokeandcode.com/wiki/doku.php?id=tiled_import_and_use

Комментариев нет:

Отправить комментарий