From e3ea7cbed1657e32baec660dba7a2fd732f391a8 Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 13 Jan 2024 10:09:21 +0100 Subject: [PATCH 1/6] Ajout d'un vrai delta time --- src/engine/engine.py | 26 ++++++++++++++++---------- src/engine/entity_manager.py | 2 +- src/engine/renderer.py | 2 +- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/engine/engine.py b/src/engine/engine.py index 1aa6c61..70732ab 100644 --- a/src/engine/engine.py +++ b/src/engine/engine.py @@ -1,3 +1,5 @@ +import time + from src.engine.boss_fight_manager import BossFightManager from src.engine.camera import Camera from src.engine.dialogs_manager import DialogsManager @@ -24,8 +26,6 @@ class Engine: # Etat courant du jeu self.game_state = GameState.NORMAL - self.clock = pygame.time.Clock() - self.running = False # Composants du moteur de jeu @@ -44,20 +44,26 @@ class Engine: """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. Attend jusqu'à la fin du jeu.""" self.running = True - while self.running: - self.update() - self.clock.tick(60.) - def update(self): + delta = 1. # Le delta est le temps depuis la dernière image + last_time = time.time_ns()/10E8 + while self.running: + self.update(delta) + + new_time = time.time_ns()/10E8 + delta = new_time-last_time + last_time = new_time + + def update(self, delta: float): """Fonction qui regroupe toutes les updates des composants. Elle permet de mettre à jour le jeu quand on l'appelle.""" self.camera.update() - self.entity_manager.update(0.016666666) - self.renderer.update(0.016666666) + self.entity_manager.update(delta) + self.renderer.update(delta) self.event_handler.update() self.event_sheduler.update() - self.dialogs_manager.update(0.016666666) - self.sound_manager.update(1/60) + self.dialogs_manager.update(delta) + self.sound_manager.update(delta) def stop(self): """Arrête le programme.""" diff --git a/src/engine/entity_manager.py b/src/engine/entity_manager.py index 6b45414..1744339 100644 --- a/src/engine/entity_manager.py +++ b/src/engine/entity_manager.py @@ -69,4 +69,4 @@ class EntityManager: e.unlock() self.paused = False - self.locked_before_pause = [] \ No newline at end of file + self.locked_before_pause = [] diff --git a/src/engine/renderer.py b/src/engine/renderer.py index ebfbd33..d6a3746 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -172,7 +172,7 @@ class Renderer: # Conteur de FPS en mode DEBUG if self.engine.DEBUG_MODE: - self.window.blit(font.SysFont("Arial", 20).render(f"FPS: {round(self.engine.clock.get_fps())}, Game Status: {'Paused' if self.engine.entity_manager.paused else 'Playing'}", True, (255, 0, 0)), + self.window.blit(font.SysFont("Arial", 20).render(f"FPS: {round(1/delta if delta else 1)}, Game Status: {'Paused' if self.engine.entity_manager.paused else 'Playing'}", True, (255, 0, 0)), (0, 0)) player = self.engine.entity_manager.get_by_name('player') self.window.blit(font.SysFont("Arial", 20).render(f"X: {round(player.x, 2)} Y:{round(player.y, 2)}", -- 2.43.4 From 46ca725a7e38ade2617ac6e4d7ddee0885662a0e Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 13 Jan 2024 10:24:05 +0100 Subject: [PATCH 2/6] =?UTF-8?q?Implementation=20du=20delta=20time=20pour?= =?UTF-8?q?=20les=20entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/custom_AI.py | 2 +- src/engine/engine.py | 2 +- src/engine/entity.py | 8 ++++---- src/engine/entity_manager.py | 5 ++--- src/engine/event_handler.py | 10 +++++----- src/main.py | 4 ++-- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/custom_AI.py b/src/custom_AI.py index 038540c..f90993e 100644 --- a/src/custom_AI.py +++ b/src/custom_AI.py @@ -66,4 +66,4 @@ class WolfAI(MobAI): # On fait avancer le loup quand il le doit if self.comportment == 1: - self.entity.move(self.walk_x, self.walk_y, self.map_manager) + self.entity.move(self.walk_x, self.walk_y, self.map_manager, delta) diff --git a/src/engine/engine.py b/src/engine/engine.py index 70732ab..596ae3c 100644 --- a/src/engine/engine.py +++ b/src/engine/engine.py @@ -60,7 +60,7 @@ class Engine: self.camera.update() self.entity_manager.update(delta) self.renderer.update(delta) - self.event_handler.update() + self.event_handler.update(delta) self.event_sheduler.update() self.dialogs_manager.update(delta) self.sound_manager.update(delta) diff --git a/src/engine/entity.py b/src/engine/entity.py index 9b7e571..88ea774 100644 --- a/src/engine/entity.py +++ b/src/engine/entity.py @@ -116,10 +116,10 @@ class Entity: return collision - def move(self, x: float, y: float, map_manager: MapManager): + def move(self, x: float, y: float, map_manager: MapManager, delta: float): """Fait bouger l'entité en tenant compte des collisions.""" - if not self.locked: # Si l'entité n'est pas verrouillée on calcul le mouvement + if not self.locked: # Si l'entité n'est pas verrouillée on calcul le mouvement # On vérifie le sens du mouvement pour changer self.direction if x > 0: @@ -131,8 +131,8 @@ class Entity: # On normalise la vitesse initial_speed = math.sqrt(x**2+y**2) - x = x/initial_speed*self.max_speed - y = y/initial_speed*self.max_speed + x = x*delta/initial_speed*self.max_speed + y = y*delta/initial_speed*self.max_speed # On simule le mouvement. Si on ne rencontre pas de collision, on applique le mouvement diff --git a/src/engine/entity_manager.py b/src/engine/entity_manager.py index 1744339..f7ac98c 100644 --- a/src/engine/entity_manager.py +++ b/src/engine/entity_manager.py @@ -21,10 +21,10 @@ class EntityManager: """Définit l'entité donnée comme le joueur. Elle peut donc être controlée.""" self.player_entity_name = name - def move_player_controls(self, x: float, y: float): + def move_player_controls(self, x: float, y: float, delta: float): """Bouge le joueur. X et y doivent être compris entre 0 et 1""" player: Entity = self.get_by_name(self.player_entity_name) - player.move(x, y, self.map_manager) + player.move(x, y, self.map_manager, delta) def update(self, delta: float): """Met à jour toutes les entités enregistrées.""" @@ -61,7 +61,6 @@ class EntityManager: e.lock() self.paused = True - def resume(self): """Reprend les mouvement de toutes les entitées qui n'étaient pas lock avant l'appel de .pause()""" for e in self.get_all_entities(): diff --git a/src/engine/event_handler.py b/src/engine/event_handler.py index 3e77cfe..3cdf804 100644 --- a/src/engine/event_handler.py +++ b/src/engine/event_handler.py @@ -98,7 +98,7 @@ class EventHandler: return x_value, y_value - def update(self): + def update(self, delta: float): """Vérifie s'il y a de nouvelles interactions et les traites.""" window_size = display.get_window_size() @@ -203,13 +203,13 @@ class EventHandler: if self.engine.entity_manager.player_entity_name: if K_RIGHT in self.key_pressed: - self.engine.entity_manager.move_player_controls(1, 0) + self.engine.entity_manager.move_player_controls(1, 0, delta) if K_LEFT in self.key_pressed: - self.engine.entity_manager.move_player_controls(-1, 0) + self.engine.entity_manager.move_player_controls(-1, 0, delta) if K_UP in self.key_pressed: - self.engine.entity_manager.move_player_controls(0, -1) + self.engine.entity_manager.move_player_controls(0, -1, delta) 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, delta) if K_SPACE in self.key_pressed: self.engine.dialogs_manager.next_signal() diff --git a/src/main.py b/src/main.py index 9effaca..1ecf7ef 100644 --- a/src/main.py +++ b/src/main.py @@ -72,7 +72,7 @@ class Game(Engine): player.collision_rect = [-6, -7, 6, 16] player.set_default_life(15) - player.max_speed = 1.1 + player.max_speed = 64.0 self.entity_manager.set_player_entity("player") @@ -95,7 +95,7 @@ class Game(Engine): mob.collision_rect = [-15, -7, 12, 7] mob.set_default_life(5) - mob.max_speed = 1. + mob.max_speed = 60. mob.x, mob.y = 1600, 16 -- 2.43.4 From 15fad80c2ec2bc0ee9d780d133bbb9e5f56562ff Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 13 Jan 2024 10:29:53 +0100 Subject: [PATCH 3/6] =?UTF-8?q?Implementation=20du=20delta=20time=20pour?= =?UTF-8?q?=20la=20cam=C3=A9ra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/engine/camera.py | 10 +++++----- src/engine/engine.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/engine/camera.py b/src/engine/camera.py index 3c992b3..357b656 100644 --- a/src/engine/camera.py +++ b/src/engine/camera.py @@ -15,11 +15,11 @@ class Camera: self.target_y = self.y self.target_zoom = self.zoom - self.smoothness = 20. + self.smoothness = 0.5 self.followed_entity: Entity | None = None - def update(self): + def update(self, delta: float): """Met à jour la caméra. Permet, par exemple, de faire le scrolling.""" # Si on suit une entité, on met à jour les coordonnées de suivi @@ -29,9 +29,9 @@ class Camera: self.target_y = (self.followed_entity.y + self.followed_entity.mouvements[1] * self.player_moving_offset / self.zoom) - self.x += (self.target_x - self.x) / self.smoothness - self.y += (self.target_y - self.y) / self.smoothness - self.zoom += (self.target_zoom - self.zoom) / self.smoothness + self.x += (self.target_x - self.x)*delta / self.smoothness + self.y += (self.target_y - self.y)*delta / self.smoothness + self.zoom += (self.target_zoom - self.zoom)*delta / self.smoothness def follow_entity(self, entity: Entity | None): """Active le suivit de l'entité donnée. Mettre `None` pour retirer le suivit.""" diff --git a/src/engine/engine.py b/src/engine/engine.py index 596ae3c..1cf7a3f 100644 --- a/src/engine/engine.py +++ b/src/engine/engine.py @@ -57,7 +57,7 @@ class Engine: def update(self, delta: float): """Fonction qui regroupe toutes les updates des composants. Elle permet de mettre à jour le jeu quand on l'appelle.""" - self.camera.update() + self.camera.update(delta) self.entity_manager.update(delta) self.renderer.update(delta) self.event_handler.update(delta) -- 2.43.4 From 9e132d48d3cac3a391411fb8523fd4f490a489ce Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 13 Jan 2024 10:30:22 +0100 Subject: [PATCH 4/6] =?UTF-8?q?Fix=20du=20calcul=20du=20mouvement=20des=20?= =?UTF-8?q?entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/engine/entity.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/engine/entity.py b/src/engine/entity.py index 88ea774..86a2f0a 100644 --- a/src/engine/entity.py +++ b/src/engine/entity.py @@ -65,8 +65,23 @@ class Entity: # Si les coordonnées ont changé, l'entité a bougé - self.mouvements[0] = (self.x - self.last_x) / self.max_speed - self.mouvements[1] = (self.y - self.last_y) / self.max_speed + x_motion = (self.x - self.last_x) + + if x_motion > 0: + self.mouvements[0] = 1 + elif x_motion < 0: + self.mouvements[0] = -1 + else: + self.mouvements[0] = 0 + + y_motion = (self.y - self.last_y) + + if y_motion > 0: + self.mouvements[1] = 1 + elif y_motion < 0: + self.mouvements[1] = -1 + else: + self.mouvements[1] = 0 self.last_x = self.x self.last_y = self.y -- 2.43.4 From 277ef41773a8db0dfadb32b505ac4e1083d56179 Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 13 Jan 2024 10:40:46 +0100 Subject: [PATCH 5/6] Fix du mouvement du loup --- src/custom_AI.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/custom_AI.py b/src/custom_AI.py index f90993e..ef3a1d3 100644 --- a/src/custom_AI.py +++ b/src/custom_AI.py @@ -32,23 +32,23 @@ class WolfAI(MobAI): # On vérifie que le loup peut voir le joueur if player_distance <= self.ATTACK_DISTANCE: - # On rétablit la vitesse du loup à 1 - self.entity.max_speed = 1. + # On rétablit la vitesse du loup à 60 + self.entity.max_speed = 60. # Si le loup touche le joueur, il lui inflige des dégats if player.get_collisions_with_entity(self.entity): player.take_damages(1) # Si le loup n'est pas déja sur le joueur, on le fait s'en raprocher - if player_distance > self.entity.max_speed: + if player_distance > 1.: self.entity.move(x_distance / player_distance*self.entity.max_speed, - y_distance / player_distance*self.entity.max_speed, self.map_manager) + y_distance / player_distance*self.entity.max_speed, self.map_manager, delta) else: # Comportement d'attente # On diminue la vitesse - self.entity.max_speed = 0.5 + self.entity.max_speed = 30. self.timer -= delta # Si le timer est fini et que le loup était en train d'attendre, il commence à marcher -- 2.43.4 From 6cd2591659d9c9259d671bc66988cbf94b87b465 Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Sat, 13 Jan 2024 10:44:17 +0100 Subject: [PATCH 6/6] Fix du mouvement des particules --- src/engine/event_handler.py | 2 +- src/engine/renderer.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/event_handler.py b/src/engine/event_handler.py index 3cdf804..be33b85 100644 --- a/src/engine/event_handler.py +++ b/src/engine/event_handler.py @@ -221,7 +221,7 @@ class EventHandler: if K_p in self.key_pressed: self.engine.renderer.emit_particles(math.floor(self.engine.entity_manager.get_by_name("player").x), math.floor(self.engine.entity_manager.get_by_name("player").y), - 16, 16, 16, 1, 8, 0, 1, 0.2, 1., (0, 200, 200)) + 16, 16, 16, 1, 8, 0, 60., 0.2, 1., (0, 200, 200)) if K_o in self.key_pressed: print(f"Player pos: X = {self.engine.entity_manager.get_by_name('player').x} " f"Y = {self.engine.entity_manager.get_by_name('player').y}") diff --git a/src/engine/renderer.py b/src/engine/renderer.py index d6a3746..6717343 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -480,8 +480,8 @@ class Renderer: draw.rect(rendered_surface, part[7], part_dest + (part[2], part[2])) part[5] += delta - part[0] += part[3] - part[1] += part[4] + part[0] += part[3]*delta + part[1] += part[4]*delta if part[5] > part[6]: self.particles.remove(part) -- 2.43.4