Ajout de particules

This commit is contained in:
Yannis 2023-12-30 15:13:55 +01:00
parent ced0f8b65b
commit 469e1e4c8a
2 changed files with 57 additions and 1 deletions

View file

@ -31,8 +31,14 @@ class EventHandler:
self.engine.entity_manager.move_player_controls(0, -1) self.engine.entity_manager.move_player_controls(0, -1)
if K_DOWN in self.key_pressed: if K_DOWN in self.key_pressed:
self.engine.entity_manager.move_player_controls(0, 1) self.engine.entity_manager.move_player_controls(0, 1)
# Only for tests ! Remove on release !!!!!
if K_l in self.key_pressed: if K_l in self.key_pressed:
self.engine.entity_manager.get_by_name("player").take_damages(1) 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: if K_x in self.key_pressed:
self.engine.camera.target_zoom *= 1.01 self.engine.camera.target_zoom *= 1.01

View file

@ -1,4 +1,5 @@
import math import math
import random
from pygame import display, image, surface, transform, draw from pygame import display, image, surface, transform, draw
from pygame.locals import RESIZABLE, SRCALPHA, FULLSCREEN from pygame.locals import RESIZABLE, SRCALPHA, FULLSCREEN
@ -13,7 +14,7 @@ class Renderer:
def __init__(self, core: 'engine.Engine'): def __init__(self, core: 'engine.Engine'):
self.engine = core 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_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.window = display.set_mode(self.window_size, self.window_type)
self.tiles = [] self.tiles = []
@ -31,6 +32,38 @@ class Renderer:
# Ombres d'entités # Ombres d'entités
self.shadows = {} 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): def load_main_menu_assets(self, path: str):
"""Charge les assets du menu principal depuis le dossier donné.""" """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(0, rendered_surface)
self.render_layer(1, rendered_surface) self.render_layer(1, rendered_surface)
self.render_entities(rendered_surface, gui_surface, delta) self.render_entities(rendered_surface, gui_surface, delta)
self.render_particles(rendered_surface, delta)
self.render_layer(2, rendered_surface) self.render_layer(2, rendered_surface)
# Enfin, on redimensionne notre surface et on la colle sur la fenêtre principale # 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.""" """Ajoute une animation pour le joueur lors d'un combat de boss."""
self.boss_fight_player_animations[name] = animation 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): def render_boss_fight_scene(self, delta: float):
"""Rend les sprites du joueur et du boss lors d'un combat de boss.""" """Rend les sprites du joueur et du boss lors d'un combat de boss."""