Amélioration de l'engine et ajout d'éléments de gameplay #20
|
@ -38,3 +38,10 @@ class MapManager:
|
||||||
|
|
||||||
# Si on ne trouve pas le chunk, on renvoit "vide"
|
# Si on ne trouve pas le chunk, on renvoit "vide"
|
||||||
return 0
|
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
|
||||||
|
|
|
@ -215,7 +215,6 @@ class Renderer:
|
||||||
# On rend l'ombre
|
# On rend l'ombre
|
||||||
rendered_surface.blit(shadow_image, entity_dest)
|
rendered_surface.blit(shadow_image, entity_dest)
|
||||||
|
|
||||||
|
|
||||||
# On affiche l'image
|
# On affiche l'image
|
||||||
rendered_surface.blit(frame, entity_dest)
|
rendered_surface.blit(frame, entity_dest)
|
||||||
|
|
||||||
|
@ -276,12 +275,18 @@ class Renderer:
|
||||||
x_map_offset = math.floor((self.engine.camera.x - x_middle_offset) / self.tile_size)
|
x_map_offset = math.floor((self.engine.camera.x - x_middle_offset) / self.tile_size)
|
||||||
y_map_offset = math.floor((self.engine.camera.y - y_middle_offset) / self.tile_size)
|
y_map_offset = math.floor((self.engine.camera.y - y_middle_offset) / self.tile_size)
|
||||||
|
|
||||||
|
# On précalcule le décallage des tiles sur l'écran
|
||||||
|
tile_x_offset = - self.engine.camera.x + x_middle_offset
|
||||||
|
tile_y_offset = - self.engine.camera.y + y_middle_offset
|
||||||
|
|
||||||
# On itère pour chaque couche, toutes les tiles visibles par la caméra
|
# On itère pour chaque couche, toutes les tiles visibles par la caméra
|
||||||
for x in range(x_map_offset, x_map_offset + x_map_range):
|
for x in range(x_map_offset, x_map_offset + x_map_range):
|
||||||
|
# On précalcule les coordonnées en x
|
||||||
|
tile_render_x = math.floor(x * self.tile_size + tile_x_offset)
|
||||||
for y in range(y_map_offset, y_map_offset + y_map_range):
|
for y in range(y_map_offset, y_map_offset + y_map_range):
|
||||||
|
|
||||||
# On récupère l'id de la tile à la position donnée
|
# On récupère l'id de la tile à la position donnée
|
||||||
tile_id = self.engine.map_manager.get_tile_at(x, y, layer_id)
|
tile_id = self.engine.map_manager.get_tile_at_quick(x, y, layer_id)
|
||||||
|
|
||||||
# Si l'id est 0, il s'agit de vide donc on saute le rendu
|
# Si l'id est 0, il s'agit de vide donc on saute le rendu
|
||||||
if tile_id == 0:
|
if tile_id == 0:
|
||||||
|
@ -289,8 +294,8 @@ class Renderer:
|
||||||
|
|
||||||
# Puis, on cherche à quelle image elle correspond et on la colle sur notre surface
|
# Puis, on cherche à quelle image elle correspond et on la colle sur notre surface
|
||||||
rendered_surface.blit(self.tiles[tile_id - 1],
|
rendered_surface.blit(self.tiles[tile_id - 1],
|
||||||
(math.floor(x * self.tile_size - self.engine.camera.x + x_middle_offset),
|
(tile_render_x,
|
||||||
math.floor(y * self.tile_size - self.engine.camera.y + y_middle_offset)))
|
math.floor(y * self.tile_size + tile_y_offset)))
|
||||||
|
|
||||||
if self.engine.DEBUG_MODE and layer_id == 1:
|
if self.engine.DEBUG_MODE and layer_id == 1:
|
||||||
draw.rect(rendered_surface, (100, 100, 255),
|
draw.rect(rendered_surface, (100, 100, 255),
|
||||||
|
|
Loading…
Reference in a new issue