generated from StRobertCHSCS/python-base
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtiledmap.py
133 lines (101 loc) · 5.17 KB
/
tiledmap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
"""
-------------------------------------------------------------------------------
Name: tiledmap.py
Purpose: Code for loading tiledmaps and rooms.
Author: Wang.D
Created: 23/12/2020
-------------------------------------------------------------------------------
"""
import arcade
import pytiled_parser
from arcade.tilemap import get_tilemap_layer, _process_tile_layer, _process_object_layer, _create_sprite_from_tile, \
_get_tile_by_gid
class TiledMap(arcade.TiledMap):
def __init__(self):
super().__init__()
self.ground_list = None
self.wall_list = None
self.traps_list = None
def tutorial_world(self):
room = TiledMap()
map = arcade.tilemap.read_tmx("Maps/tutorial-world.tmx")
room.ground_list = self.process_layer(map, "ground", 1, "images")
room.wall_list = self.process_layer(map, "walls", 1, "images")
room.traps_list = self.process_layer(map, "traps", 1, "images")
return room
def stage_one(self):
room = TiledMap()
map = arcade.tilemap.read_tmx("Maps/stage1-world.tmx")
room.ground_list = arcade.tilemap.process_layer(map, "ground", 1, "images")
room.wall_list = arcade.tilemap.process_layer(map, "walls", 1, "images")
room.traps_list = arcade.tilemap.process_layer(map, "traps", 1, "images")
return room
def stage_two(self):
room = TiledMap()
map = arcade.tilemap.read_tmx("Maps/stage2-world.tmx")
room.ground_list = arcade.tilemap.process_layer(map, "ground", 1, "images")
room.wall_list = arcade.tilemap.process_layer(map, "walls", 1, "images")
room.traps_list = arcade.tilemap.process_layer(map, "traps", 1, "images")
return room
def stage_three(self):
room = TiledMap()
map = arcade.tilemap.read_tmx("Maps/stage3-world.tmx")
room.ground_list = arcade.tilemap.process_layer(map, "ground", 1, "images")
room.wall_list = arcade.tilemap.process_layer(map, "walls", 1, "images")
room.traps_list = arcade.tilemap.process_layer(map, "traps", 1, "images")
return room
def boss_world(self):
room = TiledMap()
map = arcade.tilemap.read_tmx("Maps/stageBoss-world.tmx")
room.ground_list = arcade.tilemap.process_layer(map, "ground", 1, "images")
room.wall_list = arcade.tilemap.process_layer(map, "walls", 1, "images")
room.traps_list = arcade.tilemap.process_layer(map, "traps", 1, "images")
return room
def process_layer(self, map_object: pytiled_parser.objects.TileMap,
layer_name: str,
scaling: float = 1,
base_directory: str = "") -> arcade.SpriteList:
"""
This takes a map layer returned by the read_tmx function, and creates Sprites for it.
:param map_object: The TileMap read in by read_tmx.
:param layer_name: The name of the layer that we are creating sprites for.
:param scaling: Scaling the layer up or down.
(Note, any number besides 1 can create a tearing effect,
if numbers don't evenly divide.)
:param base_directory: Base directory of the file, that we start from to
load images.
:returns: A SpriteList.
"""
if len(base_directory) > 0 and not base_directory.endswith("/"):
base_directory += "/"
layer = get_tilemap_layer(map_object, layer_name)
if layer is None:
print(f"Warning, no layer named '{layer_name}'.")
return arcade.SpriteList()
if isinstance(layer, pytiled_parser.objects.TileLayer):
return _process_tile_layer(map_object, layer, scaling, base_directory)
elif isinstance(layer, pytiled_parser.objects.ObjectLayer):
return _process_object_layer(map_object, layer, scaling, base_directory)
def _process_tile_layer(map_object: pytiled_parser.objects.TileMap,
layer: pytiled_parser.objects.TileLayer,
scaling: float = 1,
base_directory: str = "") -> arcade.SpriteList:
sprite_list = arcade.SpriteList()
map_array = layer.data
# Loop through the layer and add in the wall list
for row_index, row in enumerate(map_array):
for column_index, item in enumerate(row):
# Check for empty square
if item == 0:
continue
tile = _get_tile_by_gid(map_object, item)
if tile is None:
print(f"Warning, couldn't find tile for item {item} in layer "
f"'{layer.name}' in file '{map_object.tmx_file}'.")
continue
my_sprite = _create_sprite_from_tile(map_object, tile, scaling=scaling,
base_directory=base_directory)
my_sprite.right = column_index * (map_object.tile_size[0] * scaling)
my_sprite.top = (map_object.map_size.height - row_index - 1) * (map_object.tile_size[1] * scaling)
sprite_list.append(my_sprite)
return sprite_list