地图由图块组成,新建地图方法之一就是在地图上铺PNG图片,这些图片也就是图块。
它们的大小或许是32X32像素,或许是64X64像素。
所以在新建地图之前,要准备好这些PNG图片。
在名为“1、新建图块集合.gif”演示中,新建了一个图块集。
其实它们记录的是一个个PNG文件的路径,以XML文件的形式。
tiled软件把图块文件设定的扩展名是tsx。可以用记事本打开“first.tsx“文件查看。
<?xml version="1.0" encoding="UTF-8"?> <tileset version="1.2" tiledversion="1.2.2" name="first" tilewidth="64" tileheight="64" tilecount="4" columns="0"> <grid orientation="orthogonal" width="1" height="1"/> <tile id="0"> <image width="64" height="64" source="PNG/platformPack_item007.png"/> </tile> <tile id="1"> <image width="64" height="64" source="PNG/platformPack_item015.png"/> </tile> <tile id="2"> <image width="64" height="64" source="PNG/platformPack_item017.png"/> </tile> <tile id="3"> <image width="64" height="64" source="PNG/platformPack_tile004.png"/> </tile> </tileset>
以下是动画演示:
图块集合准备好了,就能新建地图了。
地图是分图层的,默认只有一个层。比如最低层可以通过双击的形式重命名为ground,代表地面。
可以新建一个picked层,用来放道具。当选中了哪个图层时,就是对哪个图层进行操作。
设计好了后就保存为tmx文件。
图块集合准备好了,就能新建地图了。 选择文件/创建新地图,设定宽度,高度等参数即可。
地图是分图层的,默认只有一个层。比如最低层可以通过双击的形式重命名为ground,代表地面。
这时我们可以选择右下角的图块,把它们铺上去。
如果要放一些诸如钻石,钥匙之类的,那应该新建一个层,用来放道具,图中名叫picked。
当选中了哪个图层时,就是对哪个图层进行操作。设计好了后就保存为tmx文件。
tmx文件也是一个xml文件,它记录的是地图的映射数据表。下面的tmx文件使用的是first.tsx图块文件。
在id为1的layer这个层下,data标签下面的数据为0的代表这里没有图块,为4的代表这里有一个图块,它是first.tsx中的第4个图块。
在id为2的layer这个层下也是一样,0代表没有图,有数字则代表有相应的图块。
<?xml version="1.0" encoding="UTF-8"?> <map version="1.2" tiledversion="1.2.2" orientation="orthogonal" renderorder="right-down" width="12" height="8" tilewidth="64" tileheight="64" infinite="0" nextlayerid="3" nextobjectid="1"> <tileset firstgid="1" source="first.tsx"/> <layer id="1" name="ground" width="12" height="8"> <data encoding="csv"> 0,0,0,0,0,0,0,0,4,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,4, 0,0,0,0,0,0,0,0,4,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,4, 0,0,0,4,4,4,4,0,0,0,0,4, 0,0,0,0,0,0,0,0,0,0,0,4, 4,0,0,0,0,0,0,0,0,0,0,4, 4,0,0,0,0,0,0,0,0,0,0,4 </data> </layer> <layer id="2" name="picked" width="12" height="8"> <data encoding="csv"> 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,3,3,3,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,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0 </data> </layer> </map>
Arcade模块通过以下代码读取地图:
my_map = arcade.read_tiled_map(f"house_1.tmx", SPRITE_SCALING) # 读取不可移动的平台数据阵列'ground'是一图层的名称 map_array = my_map.layers_int_data['ground'] # 从墙生成地图列表 self.wall_list = arcade.generate_sprites(my_map, 'ground', SPRITE_SCALING)
上面的代码读到的地图用my_map引用。然后通过图层的名称定位到要使用哪一层地图数据。
最后把这一层地图所有的图块生成角色对象,并把它们都放到wall_list列表中。