Skip to content

fix get_tilemap_layer not returning LayerGroup #2424

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions arcade/tilemap/tilemap.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from collections import OrderedDict
from collections.abc import Sequence
from pathlib import Path
from typing import TYPE_CHECKING, Any, Callable, cast
from typing import TYPE_CHECKING, Any, Callable, List, cast

import pytiled_parser
import pytiled_parser.tiled_object
Expand Down Expand Up @@ -373,13 +373,12 @@ def get_tilemap_layer(self, layer_path: str) -> pytiled_parser.Layer | None:
"""
assert isinstance(layer_path, str)

def _get_tilemap_layer(my_path, layers):
def _get_tilemap_layer(my_path: List[str], layers):
layer_name = my_path.pop(0)
for my_layer in layers:
if my_layer.name == layer_name:
if isinstance(my_layer, pytiled_parser.LayerGroup):
if len(my_path) != 0:
return _get_tilemap_layer(my_path, my_layer.layers)
if isinstance(my_layer, pytiled_parser.LayerGroup) and len(my_path) != 0:
return _get_tilemap_layer(my_path, my_layer.layers)
else:
return my_layer
return None
Expand Down
92 changes: 91 additions & 1 deletion tests/unit/tilemap/test_tilemap.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import arcade
from pathlib import Path

import pytiled_parser
from pytiled_parser import LayerGroup, OrderedPair, Size, TileLayer
from pytiled_parser.common_types import Color

import arcade
from arcade import TileMap


def test_one():
tile_map = arcade.load_tilemap(":resources:/tiled_maps/test_map_1.json")
Expand Down Expand Up @@ -102,3 +108,87 @@ def test_sprite_sheet():
assert first_sprite is not None
assert first_sprite.height == 16
assert first_sprite.width == 16


def test_find_layer_group():
child_layer = TileLayer(
name="P1",
visible=True,
repeat_x=False,
repeat_y=False,
parallax_factor=OrderedPair(1, 1),
id=0,
size=Size(10, 5),
tint_color=None,
data=[],
)
group = LayerGroup(
name="Platforms",
opacity=1,
repeat_x=False,
repeat_y=False,
tint_color=None,
layers=[child_layer],
)
tilemap = TileMap(
tiled_map=pytiled_parser.TiledMap(
map_file=Path(),
infinite=False,
layers=[group],
map_size=Size(10, 5),
next_layer_id=None,
next_object_id=0,
orientation="orthogonal",
render_order="right-down",
tiled_version="1.5.0",
tile_size=Size(32, 32),
tilesets={},
version="1.5",
background_color=Color(0, 160, 229, 255),
)
)

layer_group = tilemap.get_tilemap_layer("Platforms")
assert layer_group is layer_group


def test_find_layer_group_child():
child_layer = TileLayer(
name="P1",
visible=True,
repeat_x=False,
repeat_y=False,
parallax_factor=OrderedPair(1, 1),
id=0,
size=Size(10, 5),
tint_color=None,
data=[],
)
group = LayerGroup(
name="Platforms",
opacity=1,
repeat_x=False,
repeat_y=False,
tint_color=None,
layers=[child_layer],
)
tilemap = TileMap(
tiled_map=pytiled_parser.TiledMap(
map_file=Path(),
infinite=False,
layers=[group],
map_size=Size(10, 5),
next_layer_id=None,
next_object_id=0,
orientation="orthogonal",
render_order="right-down",
tiled_version="1.5.0",
tile_size=Size(32, 32),
tilesets={},
version="1.5",
background_color=Color(0, 160, 229, 255),
)
)

layer = tilemap.get_tilemap_layer("Platforms/P1")
assert layer is child_layer
Loading