====== Tiled Map Editorのデータを扱う ======
[[http://www.mapeditor.org/|Tiled Map Editor]]を使用すればゲームのマップを作成することができます。このツールはXML形式でファイルを保存しますが、JavaScript形式でエクスポートすることができ、エクスポートされたjsファイルを取り込むとTileMapsというグローバル変数にファイルの内容が格納されます。
以下は指定されたレイヤーから画像を作成する例です。Tiled Map Editorで使用したタイルセットと同じ名前でphina.jsのアセットに登録されていることを前提としています。(参考: [[https://qiita.com/minimo/items/b55b792c2fa19964acb4|phina.jsでTiledMapEditorを利用する - Qiita]]
var TileMapManager = TileMapManager || {};
/**
* @function getIamge
* @brief レイヤー画像取得処理
* 指定したマップ、レイヤーの画像をテクスチャとして取得する。
*
* @param [in] mapName マップ名
* @param [in] layerName レイヤー名
* @return マップ画像のテクスチャ
*/
TileMapManager.getIamge = function(mapName, layerName) {
// マップ名に対応するマップを取得する。
var map = TileMaps[mapName];
// マップの幅と高さのドット数を求める。
var width = map.width * map.tilewidth;
var height = map.height * map.tileheight;
// canvasを作成する。
var canvas = phina.graphics.Canvas().setSize(width, height);
// レイヤー名に対応するレイヤーを取得する。
var layer;
for (var i = 0; i < map.layers.length; i++) {
if (map.layers[i].name == layerName) {
layer = map.layers[i];
}
}
// 各タイルを作成したcanvasに描画していく。
for (var i = 0; i < layer.data.length; i++) {
// タイルが配置されている場合
if (layer.data[i] > 0) {
// 一次元配列になっているので、x座標とy座標を計算する。
var x = i % layer.width;
var y = Math.floor(i / layer.width);
// タイルを描画する。
this._drawTile(canvas, map.tilesets, layer.data[i], x * map.tilewidth, y * map.tileheight);
}
}
// テクスチャを作成し、描画結果として返す。
var texture = phina.asset.Texture();
texture.domElement = canvas.domElement;
return texture;
};
/**
* @function _drawTile
* @brief タイル描画処理
* canvasにタイルを描画する。タイルセットの名前と同じ名前でphina.jsのassetに登録をしておくこと。
*
* @param [in/out] canvas canvas
* @param [in] tilesets タイルセット配列
* @param [in] index タイルのgid
* @param [in] x 描画先x座標
* @param [in] y 描画先y座標
*/
TileMapManager._drawTile = function(canvas, tilesets, index, x, y) {
var imageName;
var tileX;
var tileY;
var tileWidth;
var tileHeight;
// gidに対応するタイルセットを検索する。
for (var i = 0; i < tilesets.length; i++) {
if (index >= tilesets[i].firstgid && index < tilesets[i].firstgid + tilesets[i].tilecount) {
imageName = tilesets[i].name;
tileX = ((index - tilesets[i].firstgid) % tilesets[i].columns) * tilesets[i].tilewidth;
tileY = Math.floor((index - tilesets[i].firstgid) / tilesets[i].columns) * tilesets[i].tileheight;
tileWidth = tilesets[i].tilewidth;
tileHeight = tilesets[i].tileheight;
break;
}
}
// 画像を取得する。
var image = phina.asset.AssetManager.get('image', imageName);
// 画像のタイルを切出してcanvasに描画する。
canvas.context.drawImage(image.domElement, tileX, tileY, tileWidth, tileHeight, x, y, tileWidth, tileHeight);
};
シーン内などで、以下のように使用すればSpriteとして作成できます。
this.map1 = Sprite(TileMapManager.getIamge('map1', 'layer1')).setOrigin(0, 0).setPosition(0, 0).addChildTo(this);