Optimisation et amélioration du rendu des entités

This commit is contained in:
Yannis 2023-12-26 17:03:21 +01:00
parent 86c611d813
commit 51161e7170
3 changed files with 40 additions and 18 deletions

View file

@ -26,6 +26,12 @@ class Anim:
# Avant de retourner l'image, on met à jour le delay # Avant de retourner l'image, on met à jour le delay
self.update_current_frame(delta) self.update_current_frame(delta)
return self.frames[self.current_frame]
def update_current_frame(self, delta: float):
"""Met à jour le delay de l'image courante avec le delta time."""
self.time += delta
# Si le delay entre deux images est écoulé, on incrémente le numéro de l'image et on remet le temps à 0 # Si le delay entre deux images est écoulé, on incrémente le numéro de l'image et on remet le temps à 0
if self.time >= self.change_frame_time: if self.time >= self.change_frame_time:
self.current_frame += 1 self.current_frame += 1
@ -35,12 +41,6 @@ class Anim:
if self.current_frame >= len(self.frames): if self.current_frame >= len(self.frames):
self.current_frame = 0 self.current_frame = 0
return self.frames[self.current_frame]
def update_current_frame(self, delta: float):
"""Met à jour le delay de l'image courante avec le delta time."""
self.time += delta
def get_specific_frame(self, base: int): def get_specific_frame(self, base: int):
"""Donne la {base} ème image apres l'image courante.""" """Donne la {base} ème image apres l'image courante."""
# Si le delay entre deux images est écoulé, on incrémente le numéro de l'image et on remet le temps à 0 # Si le delay entre deux images est écoulé, on incrémente le numéro de l'image et on remet le temps à 0

View file

@ -1,3 +1,5 @@
import random
from src.animation import Anim from src.animation import Anim
from src.camera import Camera from src.camera import Camera
from src.entity_manager import EntityManager from src.entity_manager import EntityManager
@ -49,6 +51,19 @@ class Engine:
self.camera.follow_entity(player) self.camera.follow_entity(player)
for i in range(20):
anim = Anim(0.5)
anim.load_animation_from_directory("assets/entities/player/none")
self.renderer.register_animation(anim, f"player_none_{i}")
test = self.entity_manager.register_entity(f"test_{i}")
test.x = random.randint(0, 200)
test.y = random.randint(0, 200)
test.link_animation(f"player_none_{i}")
test.collision_rect = [-7, -7, 7, 7]
test.set_default_life(10)
def loop(self): def loop(self):
"""Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle.
Attend jusqu'à la fin du jeu.""" Attend jusqu'à la fin du jeu."""
@ -62,7 +77,7 @@ class Engine:
l'appelle.""" l'appelle."""
self.camera.update() self.camera.update()
self.entity_manager.update(0.016666666) self.entity_manager.update(0.016666666)
self.renderer.update() self.renderer.update(0.016666666)
self.event_handler.update() self.event_handler.update()
def stop(self): def stop(self):

View file

@ -30,7 +30,7 @@ class Renderer:
tile = tile_set.subsurface((x * tile_size, y * tile_size, tile_size, tile_size)) tile = tile_set.subsurface((x * tile_size, y * tile_size, tile_size, tile_size))
self.tiles.append(tile) self.tiles.append(tile)
def update(self): def update(self, delta: float):
"""Fait le rendu du jeu.""" """Fait le rendu du jeu."""
self.window.fill((255, 255, 255)) self.window.fill((255, 255, 255))
@ -45,7 +45,7 @@ class Renderer:
gui_surface.fill((0, 0, 0, 0)) gui_surface.fill((0, 0, 0, 0))
self.renderer_layer(0, rendered_surface) self.renderer_layer(0, rendered_surface)
self.render_entities(rendered_surface, gui_surface) self.render_entities(rendered_surface, gui_surface, delta)
self.renderer_layer(1, rendered_surface) self.renderer_layer(1, rendered_surface)
self.renderer_layer(2, rendered_surface) self.renderer_layer(2, rendered_surface)
@ -67,7 +67,7 @@ class Renderer:
"""Enregistre une animation.""" """Enregistre une animation."""
self.animations[name] = animation self.animations[name] = animation
def render_entities(self, rendered_surface: surface.Surface, gui_surface: surface.Surface): def render_entities(self, rendered_surface: surface.Surface, gui_surface: surface.Surface, delta: float):
"""Rend toutes les entités.""" """Rend toutes les entités."""
# On calcule le décalage pour centrer la caméra # On calcule le décalage pour centrer la caméra
x_middle_offset = display.get_window_size()[0] / 2 / self.engine.camera.zoom x_middle_offset = display.get_window_size()[0] / 2 / self.engine.camera.zoom
@ -76,11 +76,18 @@ class Renderer:
for entity in self.engine.entity_manager.get_all_entities(): for entity in self.engine.entity_manager.get_all_entities():
# On récupère la frame courante de l'animation # On récupère la frame courante de l'animation
anim: Anim = self.animations[entity.animation_name] anim: Anim = self.animations[entity.animation_name]
frame = anim.get_frame(0.01666667) frame = anim.get_frame(delta)
# 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
entity.y - self.engine.camera.y + y_middle_offset + frame.get_height() < 0 or
entity.y - self.engine.camera.y - y_middle_offset - frame.get_height() > 0):
continue
# On calcule les coordonnées de rendu de l'entité # On calcule les coordonnées de rendu de l'entité
entity_dest = (entity.x - self.engine.camera.x + x_middle_offset - frame.get_width() / 2, entity_dest = (math.floor(entity.x - self.engine.camera.x + x_middle_offset - frame.get_width() / 2),
entity.y - self.engine.camera.y + y_middle_offset - frame.get_height() / 2) math.floor(entity.y - self.engine.camera.y + y_middle_offset - frame.get_height() / 2))
# On affiche l'image # On affiche l'image
rendered_surface.blit(frame, entity_dest) rendered_surface.blit(frame, entity_dest)
@ -95,10 +102,10 @@ class Renderer:
cooldown_value = entity.damage_cooldown / entity.default_damage_cooldown cooldown_value = entity.damage_cooldown / entity.default_damage_cooldown
# On calcule où placer la barre de vei sur la surface des GUI # On calcule où placer la barre de vei sur la surface des GUI
life_bar_dest = ((entity.x - self.engine.camera.x + x_middle_offset) * self.engine.camera.zoom - life_bar_dest = (math.floor((entity.x - self.engine.camera.x + x_middle_offset) * self.engine.camera.zoom -
life_bar_width / 2, life_bar_width / 2),
(entity.y - self.engine.camera.y + y_middle_offset - frame.get_height() / 2) * math.floor((entity.y - self.engine.camera.y + y_middle_offset - frame.get_height() / 2) *
self.engine.camera.zoom - life_bar_height - life_bar_y_offset) self.engine.camera.zoom - life_bar_height - life_bar_y_offset))
# Contour de la barre de vie # Contour de la barre de vie
draw.rect(gui_surface, (20, 0, 0), (life_bar_dest[0] - life_bar_border, draw.rect(gui_surface, (20, 0, 0), (life_bar_dest[0] - life_bar_border,
@ -107,7 +114,7 @@ class Renderer:
life_bar_height + life_bar_border * 2)) life_bar_height + life_bar_border * 2))
# Barre de vie # Barre de vie
draw.rect(gui_surface, (255-255*life_bar_value, 255*life_bar_value, 0), draw.rect(gui_surface, (255 - 255 * life_bar_value, 255 * life_bar_value, 0),
life_bar_dest + (life_bar_width * life_bar_value, life_bar_height)) life_bar_dest + (life_bar_width * life_bar_value, life_bar_height))
draw.rect(gui_surface, (200, 200, 200), draw.rect(gui_surface, (200, 200, 200),