Tile ID来自Tiled?

时间:2016-05-08 14:28:42

标签: javascript php phaser-framework tiled

我过去使用TiledPhaser游戏构建JSON tilemap文件。我现在想用PHP构建我的JSON map files

这是一个示例对象:

{
    "height": 50,
    "layers": [{
        "data": [5884, 5885, 5886, 5887, 5888, 5885],
        "height": 50,
        "name": "background",
        "opacity": 1,
        "type": "tilelayer",
        "visible": true,
        "width": 50,
        "x": 0,
        "y": 0
    }],
    "orientation": "orthogonal",
    "properties": {},
    "tileheight": 16,
    "tilesets": [{
        "firstgid": 1,
        "image": "tiles.png",
        "imageheight": 1684,
        "imagewidth": 2738,
        "margin": 1,
        "name": "tiles",
        "properties": {},
        "spacing": 1,
        "tileheight": 16,
        "tilewidth": 16
    }],
    "tilewidth": 16,
    "version": 1,
    "width": 50
}

属性非常不言自明,并且在Github上有记录,它引用了Tiled网站上的TMX Map format docs,但都没有解释图层data属性的tile id是如何生成。

两个问题:

1)如何为“数据”数组生成Tile ID?例如,如果我有5x5瓷砖表,它们只是从左到右,从上到下分别是1到25?

2)数据数组使用全局ID,它在所有图块表中都是唯一的。这些是如何产生的?例如,如果我有3个5x5瓷砖,那么它们是1-75吗?但是按什么顺序?

1 个答案:

答案 0 :(得分:3)

根据测试结果,我将根据Tiled 0.16.1的行为以相反的顺序回答您的问题。

您可能还想最初添加单个图像,并使用XML输出(* .tmx),因为在我看来,它比JSON输出更容易看到数据格式。我在下面提供一个:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="64" tileheight="64" nextobjectid="1">
 <tileset firstgid="1" name="second" tilewidth="64" tileheight="64" tilecount="3" columns="0">
  <tile id="0">
   <image width="64" height="64" source="../../../OneDrive/Projects/Tiles/forest.png"/>
  </tile>
  <tile id="1">
   <image width="64" height="64" source="../../../OneDrive/Projects/Tiles/forest-dirt-corner-ne.png"/>
  </tile>
  <tile id="2">
   <image width="64" height="64" source="../../../OneDrive/Projects/Tiles/forest-dirt-corner-nw.png"/>
  </tile>
 </tileset>
 <tileset firstgid="4" name="third" tilewidth="64" tileheight="64" tilecount="1" columns="0">
  <tile id="0">
   <image width="64" height="64" source="../../../OneDrive/Projects/Tiles/grass.png"/>
  </tile>
 </tileset>
 <tileset firstgid="5" name="first" tilewidth="64" tileheight="64" tilecount="2" columns="0">
  <tile id="0">
   <image width="64" height="64" source="../../../OneDrive/Projects/Tiles/dirt.png"/>
  </tile>
  <tile id="1">
   <image width="64" height="64" source="../../../OneDrive/Projects/Tiles/dirt-forest-corner-ne.png"/>
  </tile>
 </tileset>
 <layer name="Tile Layer 1" width="10" height="10">
  <data encoding="csv">
1,2,3,0,0,0,0,0,0,0,
4,0,0,0,0,0,0,0,0,0,
5,6,0,0,0,0,0,0,0,0,
1,2,3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0
</data>
 </layer>
</map>

<强> 2。如何生成ID?

首先,了解有一个或多个tileset元素具有firstgid属性非常重要。 Per the documentation

  

firstgid :此tileset的第一个全局tile ID(此全局ID映射到此tileset中的第一个tile)。

此外:

  

第一个tileset的{​​{1}}值始终为1.

我们会进一步了解firstgidtile

  

id:其tileset中的本地tile ID。

因此,在上面的示例中,您会看到id内有三个tileset firstgid="1"个元素,其中tile的范围是0到2.做数学计算你看到这些是具有1,2和3的唯一ID的图块。

下一个id的{​​{1}}为4,因为tileset s 1,2和3的图块已经出现过。其中的第一个firstgid的{​​{1}}为0,并且由于4 + 0 = 4,我们知道第4个id是什么。

如果在Tiled界面中移动tilesets,那么id也会相应更新。因此,第一个tileset中的第一个tile将始终具有id。

  

例如,如果我有3张5x5瓷砖,那么它们是1-75吗?但是按什么顺序?

是的,它将基于瓷砖表添加到的图块集的顺序。

<强> 1。如何为tile数组生成ID?

ids基于生成的id,这与你的第二个问题有关,如上所述。 “0”表示没有图块,而“1”表示第一个图块集中的第一个图块(左上角)。

所以:

  

例如,如果我有5x5的瓷砖表,它们是从左到右,从上到下只有1到25?