48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
import json
|
|
|
|
|
|
class MapManager:
|
|
"""Stocke les cartes du jeu."""
|
|
def __init__(self):
|
|
# structure : [layers{chunks[x, y][data]}
|
|
self.map_layers = []
|
|
self.chunk_width = 16
|
|
self.chunk_height = 16
|
|
|
|
def load_new(self, file_path: str):
|
|
"""Charge une map infinie au format tiled."""
|
|
with open(file_path, "r") as file:
|
|
data = json.loads(file.read())
|
|
for layer in data["layers"]:
|
|
chunks = {}
|
|
for chunk in layer["chunks"]:
|
|
chunks[(chunk["x"]//self.chunk_width, chunk["y"]//self.chunk_height)] = chunk["data"]
|
|
self.map_layers.append(chunks)
|
|
|
|
def get_tile_at(self, x: int, y: int, layer_id: int):
|
|
"""Donne l'id de la tile aux coordonnées données et à la couche choisie."""
|
|
|
|
# On récupère la couche demandée
|
|
layer = self.map_layers[layer_id]
|
|
|
|
# On calcule les coordonnées du chunk
|
|
coordinates = (x//self.chunk_width, y//self.chunk_height)
|
|
|
|
# On vérifie que le chunk existe
|
|
if coordinates in layer:
|
|
chunk = layer[coordinates]
|
|
|
|
# On transforme les coordonnées globales en coordonnées dans le chunk,
|
|
# On calcule l'index et on renvoie la tile
|
|
return chunk[x % 16 + y % 16 * self.chunk_width]
|
|
|
|
# Si on ne trouve pas le chunk, on renvoit "vide"
|
|
return 0
|
|
|
|
def get_tile_at_quick(self, x: int, y: int, layer_id: int):
|
|
"""Version optimisée de get_tile_at()."""
|
|
chunk = self.map_layers[layer_id].get((x//self.chunk_width, y//self.chunk_height))
|
|
if chunk is not None:
|
|
return chunk[x % 16 + y % 16 * self.chunk_width]
|
|
return 0
|