Skip to content

Commit ec893f8

Browse files
committed
Ensure proper order of group layers in TMX format (#78)
1 parent 81e3dcb commit ec893f8

File tree

8 files changed

+183
-32
lines changed

8 files changed

+183
-32
lines changed

pytiled_parser/parsers/tmx/layer.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -327,23 +327,9 @@ def _parse_group_layer(
327327
LayerGroup: The LayerGroup created from raw_layer
328328
"""
329329
layers: List[Layer] = []
330-
for layer in raw_layer.findall("./layer"):
331-
layers.append(_parse_tile_layer(layer))
332-
333-
for layer in raw_layer.findall("./objectgroup"):
334-
layers.append(_parse_object_layer(layer, encoding, parent_dir))
335-
336-
for layer in raw_layer.findall("./imagelayer"):
337-
layers.append(_parse_image_layer(layer))
338-
339-
for layer in raw_layer.findall("./group"):
340-
layers.append(_parse_group_layer(layer, encoding, parent_dir))
341-
# layers = []
342-
# layers = [
343-
# parse(child_layer, parent_dir=parent_dir)
344-
# for child_layer in raw_layer.iter()
345-
# if child_layer.tag in ["layer", "objectgroup", "imagelayer", "group"]
346-
# ]
330+
for element in raw_layer:
331+
if element.tag in ["layer", "objectgroup", "imagelayer", "group"]:
332+
layers.append(parse(element, encoding, parent_dir))
347333

348334
return LayerGroup(layers=layers, **_parse_common(raw_layer).__dict__)
349335

pytiled_parser/parsers/tmx/tiled_map.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def parse(file: Path, encoding: str) -> TiledMap:
6262
)
6363

6464
layers = []
65-
for element in raw_map.findall("./*"):
65+
for element in raw_map:
6666
if element.tag in ["layer", "objectgroup", "imagelayer", "group"]:
6767
layers.append(parse_layer(element, encoding, parent_dir))
6868

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from pathlib import Path
2+
3+
from pytiled_parser import common_types, layer, tiled_object
4+
5+
EXPECTED = [
6+
layer.ObjectLayer(
7+
name="Outer 2",
8+
opacity=1,
9+
visible=True,
10+
id=13,
11+
draw_order="topdown",
12+
tiled_objects=[],
13+
parallax_factor=common_types.OrderedPair(1.0, 1.0),
14+
),
15+
layer.LayerGroup(
16+
name="Outer Group",
17+
opacity=1,
18+
visible=True,
19+
id=4,
20+
parallax_factor=common_types.OrderedPair(1.0, 1.0),
21+
layers=[
22+
layer.ObjectLayer(
23+
name="Inner 2",
24+
opacity=1,
25+
visible=True,
26+
id=15,
27+
draw_order="topdown",
28+
tiled_objects=[],
29+
parallax_factor=common_types.OrderedPair(1.0, 1.0),
30+
),
31+
layer.LayerGroup(
32+
name="Inner Group",
33+
id=6,
34+
layers=[],
35+
visible=True,
36+
opacity=1,
37+
parallax_factor=common_types.OrderedPair(1.0, 1.0),
38+
),
39+
layer.ObjectLayer(
40+
name="Inner 1",
41+
opacity=1,
42+
visible=True,
43+
id=14,
44+
draw_order="topdown",
45+
tiled_objects=[],
46+
parallax_factor=common_types.OrderedPair(1.0, 1.0),
47+
),
48+
],
49+
),
50+
layer.ObjectLayer(
51+
name="Outer 1",
52+
opacity=1,
53+
visible=True,
54+
id=12,
55+
draw_order="topdown",
56+
parallax_factor=common_types.OrderedPair(1.0, 1.0),
57+
tiled_objects=[],
58+
),
59+
]
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
{ "compressionlevel":-1,
2+
"height":6,
3+
"infinite":false,
4+
"layers":[
5+
{
6+
"draworder":"topdown",
7+
"id":13,
8+
"name":"Outer 2",
9+
"objects":[],
10+
"opacity":1,
11+
"type":"objectgroup",
12+
"visible":true,
13+
"x":0,
14+
"y":0
15+
},
16+
{
17+
"id":4,
18+
"layers":[
19+
{
20+
"draworder":"topdown",
21+
"id":15,
22+
"name":"Inner 2",
23+
"objects":[],
24+
"opacity":1,
25+
"type":"objectgroup",
26+
"visible":true,
27+
"x":0,
28+
"y":0
29+
},
30+
{
31+
"id":6,
32+
"layers":[],
33+
"name":"Inner Group",
34+
"opacity":1,
35+
"type":"group",
36+
"visible":true,
37+
"x":0,
38+
"y":0
39+
},
40+
{
41+
"draworder":"topdown",
42+
"id":14,
43+
"name":"Inner 1",
44+
"objects":[],
45+
"opacity":1,
46+
"type":"objectgroup",
47+
"visible":true,
48+
"x":0,
49+
"y":0
50+
}],
51+
"name":"Outer Group",
52+
"opacity":1,
53+
"type":"group",
54+
"visible":true,
55+
"x":0,
56+
"y":0
57+
},
58+
{
59+
"draworder":"topdown",
60+
"id":12,
61+
"name":"Outer 1",
62+
"objects":[],
63+
"opacity":1,
64+
"type":"objectgroup",
65+
"visible":true,
66+
"x":0,
67+
"y":0
68+
}],
69+
"nextlayerid":16,
70+
"nextobjectid":12,
71+
"orientation":"orthogonal",
72+
"renderorder":"right-down",
73+
"tiledversion":"1.9.2",
74+
"tileheight":32,
75+
"tilesets":[
76+
{
77+
"firstgid":1,
78+
"source":"tileset.json"
79+
}],
80+
"tilewidth":32,
81+
"type":"map",
82+
"version":"1.9",
83+
"width":8
84+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="8" height="6" tilewidth="32" tileheight="32" infinite="0" nextlayerid="16" nextobjectid="12">
3+
<tileset firstgid="1" source="tileset.json"/>
4+
<objectgroup id="13" name="Outer 2"/>
5+
<group id="4" name="Outer Group">
6+
<objectgroup id="15" name="Inner 2"/>
7+
<group id="6" name="Inner Group"/>
8+
<objectgroup id="14" name="Inner 1"/>
9+
</group>
10+
<objectgroup id="12" name="Outer 1"/>
11+
</map>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{ "columns":8,
2+
"image":"..\/..\/images\/tmw_desert_spacing.png",
3+
"imageheight":199,
4+
"imagewidth":265,
5+
"margin":1,
6+
"name":"tile_set_image",
7+
"spacing":1,
8+
"tilecount":48,
9+
"tiledversion":"1.9.0",
10+
"tileheight":32,
11+
"tilewidth":32,
12+
"type":"tileset",
13+
"version":"1.8"
14+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<tileset version="1.9" tiledversion="1.9.0" name="tile_set_image" tilewidth="32" tileheight="32" spacing="1" margin="1" tilecount="48" columns="8">
3+
<image source="../../images/tmw_desert_spacing.png" width="265" height="199"/>
4+
</tileset>

tests/test_layer.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
LAYER_TESTS / "no_layers",
2626
LAYER_TESTS / "infinite_map",
2727
LAYER_TESTS / "infinite_map_b64",
28+
LAYER_TESTS / "group_layer_order",
2829
]
2930

3031
ZSTD_LAYER_TEST = LAYER_TESTS / "b64_zstd"
@@ -79,26 +80,17 @@ def test_layer_integration(parser_type, layer_test):
7980
elif parser_type == "tmx":
8081
raw_layers_path = layer_test / "map.tmx"
8182
with open(raw_layers_path) as raw_layers_file:
82-
raw_layer = etree.parse(raw_layers_file).getroot()
83+
raw_map = etree.parse(raw_layers_file).getroot()
8384
layers = []
84-
for layer in raw_layer.findall("./layer"):
85-
layers.append(parse_tmx(layer, encoding="utf-8"))
86-
87-
for layer in raw_layer.findall("./objectgroup"):
88-
layers.append(parse_tmx(layer, encoding="utf-8"))
89-
90-
for layer in raw_layer.findall("./group"):
91-
layers.append(parse_tmx(layer, encoding="utf-8"))
92-
93-
for layer in raw_layer.findall("./imagelayer"):
94-
layers.append(parse_tmx(layer, encoding="utf-8"))
85+
for element in raw_map:
86+
if element.tag in ["layer", "objectgroup", "imagelayer", "group"]:
87+
layers.append(parse_tmx(element, encoding="utf-8"))
9588

9689
for layer in layers:
9790
fix_layer(layer)
9891

9992
for layer in expected.EXPECTED:
10093
fix_layer(layer)
101-
print(layer.size)
10294

10395
assert layers == expected.EXPECTED
10496

@@ -111,7 +103,8 @@ def test_zstd_not_installed(parser_type):
111103
raw_layers = json.load(raw_layers_file)["layers"]
112104
with pytest.raises(ValueError):
113105
layers = [
114-
parse_json(raw_layer, encoding="utf-8") for raw_layer in raw_layers
106+
parse_json(raw_layer, encoding="utf-8")
107+
for raw_layer in reversed(raw_layers)
115108
]
116109
elif parser_type == "tmx":
117110
raw_layers_path = ZSTD_LAYER_TEST / "map.tmx"

0 commit comments

Comments
 (0)