From 469e1e4c8a675b16417ebd422dbed2d7aa6c9871 Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 30 Dec 2023 15:13:55 +0100 Subject: [PATCH] Ajout de particules --- src/engine/event_handler.py | 6 +++++ src/engine/renderer.py | 52 ++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/engine/event_handler.py b/src/engine/event_handler.py index 79dc586..5e6064b 100644 --- a/src/engine/event_handler.py +++ b/src/engine/event_handler.py @@ -31,8 +31,14 @@ class EventHandler: self.engine.entity_manager.move_player_controls(0, -1) if K_DOWN in self.key_pressed: self.engine.entity_manager.move_player_controls(0, 1) + + # Only for tests ! Remove on release !!!!! if K_l in self.key_pressed: self.engine.entity_manager.get_by_name("player").take_damages(1) + if K_p in self.key_pressed: + self.engine.renderer.emit_particles(self.engine.entity_manager.get_by_name("player").x, + self.engine.entity_manager.get_by_name("player").y, + 16, 16, 16, 1, 8, 0, 1, 0.2, 1., (0, 200, 200)) if K_x in self.key_pressed: self.engine.camera.target_zoom *= 1.01 diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 37c72f6..2ad49d5 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -1,4 +1,5 @@ import math +import random from pygame import display, image, surface, transform, draw from pygame.locals import RESIZABLE, SRCALPHA, FULLSCREEN @@ -13,7 +14,7 @@ class Renderer: def __init__(self, core: 'engine.Engine'): self.engine = core - self.window_type = FULLSCREEN + self.window_type = RESIZABLE self.window_size = (display.Info().current_w, display.Info().current_h) if self.window_type == FULLSCREEN else (600, 600) self.window = display.set_mode(self.window_size, self.window_type) self.tiles = [] @@ -31,6 +32,38 @@ class Renderer: # Ombres d'entités self.shadows = {} + # Particules affichées + self.particles = [] + + def emit_particles(self, x: int, y: int, w: int, h: int, count: int, min_size: int, max_size: int, + min_speed: float, max_speed: float, min_life_time: float, max_life_time: float, + color: tuple[int, int, int]): + """Emmet des particules aux coordonnées données dans un rectangle de demi-largeur {w} et de demi-hauteur {h}.""" + for _ in range(count): + # On choisit la taille de la particule + part_size = random.randint(min_size, max_size) + + # On choisit sa vitesse en x et en y + part_speed_x = random.uniform(min_speed, max_speed) + + # On inverse la vitesse de manière aléatoire + if random.randint(0, 1) == 1: + part_speed_x = - part_speed_x + part_speed_y = random.uniform(min_speed, max_speed) + if random.randint(0, 1) == 1: + part_speed_y = - part_speed_y + + # On choisit sa position dans le rectangle + part_x = random.randint(x-w, x+w-part_size) + part_y = random.randint(y-h, y+h-part_size) + + # On choisit la durée de vie + part_life_time = random.uniform(min_life_time, max_life_time) + + # On ajoute la particule dans la liste des particules + # Le 0 correspond au temps de vie depuis la création de la particule + self.particles.append([part_x, part_y, part_size, part_speed_x, part_speed_y, 0., part_life_time, color]) + def load_main_menu_assets(self, path: str): """Charge les assets du menu principal depuis le dossier donné.""" @@ -63,6 +96,7 @@ class Renderer: self.render_layer(0, rendered_surface) self.render_layer(1, rendered_surface) self.render_entities(rendered_surface, gui_surface, delta) + self.render_particles(rendered_surface, delta) self.render_layer(2, rendered_surface) # Enfin, on redimensionne notre surface et on la colle sur la fenêtre principale @@ -98,6 +132,22 @@ class Renderer: """Ajoute une animation pour le joueur lors d'un combat de boss.""" self.boss_fight_player_animations[name] = animation + def render_particles(self, rendered_surface: surface.Surface, delta: float): + """Update et rend les particules.""" + x_middle_offset = display.get_window_size()[0] / 2 / self.engine.camera.zoom + y_middle_offset = display.get_window_size()[1] / 2 / self.engine.camera.zoom + + for part in self.particles.copy(): + part_dest = (math.floor(part[0] - self.engine.camera.x + x_middle_offset), + math.floor(part[1] - self.engine.camera.y + y_middle_offset)) + + draw.rect(rendered_surface, part[7], part_dest + (part[2], part[2])) + part[5] += delta + part[0] += part[3] + part[1] += part[4] + if part[5] > part[6]: + self.particles.remove(part) + def render_boss_fight_scene(self, delta: float): """Rend les sprites du joueur et du boss lors d'un combat de boss."""