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)
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

View file

@ -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."""