diff --git a/assets/textures/entities/player/none/layers.pdn b/assets/textures/entities/player/none/layers.pdn index 13b5a45..deb5bf9 100644 Binary files a/assets/textures/entities/player/none/layers.pdn and b/assets/textures/entities/player/none/layers.pdn differ diff --git a/assets/textures/entities/player/shadow.png b/assets/textures/entities/player/shadow.png new file mode 100644 index 0000000..200a81e Binary files /dev/null and b/assets/textures/entities/player/shadow.png differ diff --git a/src/engine/entity.py b/src/engine/entity.py index 877ae3d..b03ba9d 100644 --- a/src/engine/entity.py +++ b/src/engine/entity.py @@ -36,6 +36,8 @@ class Entity: self.animation_name = None + self.shadow = None + def set_default_life(self, life: int): """Définit le nombre de PV de l'entité. Mettre -1 pour rendre l'entité immortelle.""" self.life_points = life diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 3b17e40..37c72f6 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -28,6 +28,9 @@ class Renderer: # Variables utilisées par le menu principal self.main_menu_assets: dict[str: Anim] = {} + # Ombres d'entités + self.shadows = {} + def load_main_menu_assets(self, path: str): """Charge les assets du menu principal depuis le dossier donné.""" @@ -78,6 +81,11 @@ class Renderer: # Apres avoir tout rendu, on met à jour l'écran display.update() + def register_shadow(self, file_path: str, name: str): + """Enregistre une image d'ombre utilisée pour le rendu des entités.""" + shadow = image.load(file_path).convert_alpha() + self.shadows[name] = shadow + def register_animation(self, animation: Anim, name: str): """Enregistre une animation.""" self.animations[name] = animation @@ -131,10 +139,6 @@ class Renderer: anim: Anim = self.animations[entity.animation_name] frame = anim.get_frame(delta) - # On flip l'image horizontalement si l'entité est retournée - if entity.direction == 1: - frame = transform.flip(frame, True, False) - # Si l'entité n'apparait pas à l'écran, on passe son rendu if (entity.x - self.engine.camera.x + x_middle_offset + frame.get_width() < 0 or entity.x - self.engine.camera.x - x_middle_offset - frame.get_width() > 0 or @@ -142,10 +146,21 @@ class Renderer: entity.y - self.engine.camera.y - y_middle_offset - frame.get_height() > 0): continue + # On flip l'image horizontalement si l'entité est retournée + if entity.direction == 1: + frame = transform.flip(frame, True, False) + # On calcule les coordonnées de rendu de l'entité entity_dest = (math.floor(entity.x - self.engine.camera.x + x_middle_offset - frame.get_width() / 2), math.floor(entity.y - self.engine.camera.y + y_middle_offset - frame.get_height() / 2)) + # On récupert l'ombre de l'entité + if entity.shadow is not None: + shadow_image = self.shadows[entity.shadow] + # On rend l'ombre + rendered_surface.blit(shadow_image, entity_dest) + + # On affiche l'image rendered_surface.blit(frame, entity_dest) diff --git a/src/main.py b/src/main.py index ddb424e..8f1ec06 100644 --- a/src/main.py +++ b/src/main.py @@ -38,6 +38,9 @@ class Game(Engine): self.entity_manager.set_player_entity("player") + player.shadow = "player_shadow" + self.renderer.register_shadow("assets/textures/entities/player/shadow.png", "player_shadow") + self.camera.follow_entity(player) def load_boss_fight_assets(self):