Skip to content

Using infinite tilemaps #955

Closed
Closed
@DigammaF

Description

@DigammaF

Hi.
When you tick 'infinite' in Tiled, trying to load the tilemap will result in a confusing error:

Traceback (most recent call last):
  File "E:\dev\wW\main.py", line 69, in <module>
    main()
  File "E:\dev\wW\main.py", line 64, in main
    window.setup()
  File "E:\dev\wW\main.py", line 40, in setup
    self.tile_map = arcade.load_tilemap(map_name, TILE_SCALING, layer_options)
  File "E:\dev\wW\venv\lib\site-packages\arcade\tilemap\tilemap.py", line 829, in load_tilemap
    return TileMap(
  File "E:\dev\wW\venv\lib\site-packages\arcade\tilemap\tilemap.py", line 191, in __init__
    self._process_layer(layer, global_options, layer_options)
  File "E:\dev\wW\venv\lib\site-packages\arcade\tilemap\tilemap.py", line 216, in _process_layer
    processed = self._process_tile_layer(layer, **options)
  File "E:\dev\wW\venv\lib\site-packages\arcade\tilemap\tilemap.py", line 592, in _process_tile_layer
    for row_index, row in enumerate(map_array):
TypeError: 'NoneType' object is not iterable

The code:

map_name = "assets/main_map.json"
layer_options = { 
	"platforms": {
		"use_spatial_hash": True,
	},
}
self.tile_map = arcade.load_tilemap(map_name, TILE_SCALING, layer_options)

I went on a exploration of arcade and pytiled_parser code and I found out that when you tick 'infinite' in tiled, the dict stored in the json file has a different structure: in a finite map, each of the "layers" element has a "data" entry, but in an infinite map each of the "layers" element has a "chunks" entry instead, and each of the chunk has a "data" entry. The pytiled parser handles it with ease, but the function _process_tile_layer always relies on the "data" entry without regard to the existence of a "chunks" entry.
tilemap.py line 589:

map_array = layer.data

Obviously with an infinite map the layer.data is None because the data you want is located somewhere like [chunk.data for chunk in layer.chunks]
So the below code fails, causing the error I mentionned earlier:

for row_index, row in enumerate(map_array):

Is it intentionnal? Changing the map to a finite version were easily done, but I wasted about an hour of frustration to figure that out. Did I miss the part in the documentation mentionning the issue with infinite map? I saw there is an explicit error message when trying to load a map with duplicate layer names so I guess it would make sense to also yield an explicit error message when trying to load infinite maps if the intention is to not support these.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions