delta_time #34

Merged
yannis merged 6 commits from delta_time into main 2024-01-13 20:05:56 +00:00
8 changed files with 64 additions and 44 deletions

View file

@ -32,23 +32,23 @@ class WolfAI(MobAI):
# On vérifie que le loup peut voir le joueur # On vérifie que le loup peut voir le joueur
if player_distance <= self.ATTACK_DISTANCE: if player_distance <= self.ATTACK_DISTANCE:
# On rétablit la vitesse du loup à 1 # On rétablit la vitesse du loup à 60
self.entity.max_speed = 1. self.entity.max_speed = 60.
# Si le loup touche le joueur, il lui inflige des dégats # Si le loup touche le joueur, il lui inflige des dégats
if player.get_collisions_with_entity(self.entity): if player.get_collisions_with_entity(self.entity):
player.take_damages(1) player.take_damages(1)
# Si le loup n'est pas déja sur le joueur, on le fait s'en raprocher # 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.:
Review

Pourquoi plus que 1 ?

Pourquoi plus que 1 ?
Review

parce qu'avec une vitesse de 60, il ne s’approche plus du joueur et que 1 suffit

parce qu'avec une vitesse de 60, il ne s’approche plus du joueur et que 1 suffit
self.entity.move(x_distance / player_distance*self.entity.max_speed, 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: else:
# Comportement d'attente # Comportement d'attente
# On diminue la vitesse # On diminue la vitesse
self.entity.max_speed = 0.5 self.entity.max_speed = 30.
self.timer -= delta self.timer -= delta
# Si le timer est fini et que le loup était en train d'attendre, il commence à marcher # Si le timer est fini et que le loup était en train d'attendre, il commence à marcher
@ -66,4 +66,4 @@ class WolfAI(MobAI):
# On fait avancer le loup quand il le doit # On fait avancer le loup quand il le doit
if self.comportment == 1: 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)

View file

@ -15,11 +15,11 @@ class Camera:
self.target_y = self.y self.target_y = self.y
self.target_zoom = self.zoom self.target_zoom = self.zoom
self.smoothness = 20. self.smoothness = 0.5
self.followed_entity: Entity | None = None 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.""" """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 # 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.target_y = (self.followed_entity.y + self.followed_entity.mouvements[1] *
self.player_moving_offset / self.zoom) self.player_moving_offset / self.zoom)
self.x += (self.target_x - self.x) / self.smoothness self.x += (self.target_x - self.x)*delta / self.smoothness
self.y += (self.target_y - self.y) / self.smoothness self.y += (self.target_y - self.y)*delta / self.smoothness
self.zoom += (self.target_zoom - self.zoom) / self.smoothness self.zoom += (self.target_zoom - self.zoom)*delta / self.smoothness
def follow_entity(self, entity: Entity | None): def follow_entity(self, entity: Entity | None):
"""Active le suivit de l'entité donnée. Mettre `None` pour retirer le suivit.""" """Active le suivit de l'entité donnée. Mettre `None` pour retirer le suivit."""

View file

@ -1,3 +1,5 @@
import time
from src.engine.boss_fight_manager import BossFightManager from src.engine.boss_fight_manager import BossFightManager
from src.engine.camera import Camera from src.engine.camera import Camera
from src.engine.dialogs_manager import DialogsManager from src.engine.dialogs_manager import DialogsManager
@ -24,8 +26,6 @@ class Engine:
# Etat courant du jeu # Etat courant du jeu
self.game_state = GameState.NORMAL self.game_state = GameState.NORMAL
self.clock = pygame.time.Clock()
self.running = False self.running = False
# Composants du moteur de jeu # 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. """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."""
self.running = True 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
Review

Pk / 10e8 ?

Pk / 10e8 ?
Review

car c'est plus court et stylée que "/ 100000000"

car c'est plus court et stylée que "/ 100000000"
Review

Nan, pk dans le calcul il est en nano secondes

Nan, pk dans le calcul il est en nano secondes
Review

car il est plus précis que en secondes

car il est plus précis que en secondes
while self.running:
self.update(delta)
new_time = time.time_ns()/10E8
Review

De même

De même
Review

bah pareil

bah pareil
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 """Fonction qui regroupe toutes les updates des composants. Elle permet de mettre à jour le jeu quand on
l'appelle.""" l'appelle."""
self.camera.update() self.camera.update(delta)
self.entity_manager.update(0.016666666) self.entity_manager.update(delta)
self.renderer.update(0.016666666) self.renderer.update(delta)
self.event_handler.update() self.event_handler.update(delta)
self.event_sheduler.update() self.event_sheduler.update()
self.dialogs_manager.update(0.016666666) self.dialogs_manager.update(delta)
self.sound_manager.update(1/60) self.sound_manager.update(delta)
def stop(self): def stop(self):
"""Arrête le programme.""" """Arrête le programme."""

View file

@ -65,8 +65,23 @@ class Entity:
# Si les coordonnées ont changé, l'entité a bougé # Si les coordonnées ont changé, l'entité a bougé
self.mouvements[0] = (self.x - self.last_x) / self.max_speed x_motion = (self.x - self.last_x)
self.mouvements[1] = (self.y - self.last_y) / self.max_speed
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_x = self.x
self.last_y = self.y self.last_y = self.y
@ -116,10 +131,10 @@ class Entity:
return collision 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.""" """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 # On vérifie le sens du mouvement pour changer self.direction
if x > 0: if x > 0:
@ -131,8 +146,8 @@ class Entity:
# On normalise la vitesse # On normalise la vitesse
initial_speed = math.sqrt(x**2+y**2) initial_speed = math.sqrt(x**2+y**2)
x = x/initial_speed*self.max_speed x = x*delta/initial_speed*self.max_speed
y = y/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 # On simule le mouvement. Si on ne rencontre pas de collision, on applique le mouvement

View file

@ -21,10 +21,10 @@ class EntityManager:
"""Définit l'entité donnée comme le joueur. Elle peut donc être controlée.""" """Définit l'entité donnée comme le joueur. Elle peut donc être controlée."""
self.player_entity_name = name 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""" """Bouge le joueur. X et y doivent être compris entre 0 et 1"""
player: Entity = self.get_by_name(self.player_entity_name) 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): def update(self, delta: float):
"""Met à jour toutes les entités enregistrées.""" """Met à jour toutes les entités enregistrées."""
@ -61,7 +61,6 @@ class EntityManager:
e.lock() e.lock()
self.paused = True self.paused = True
def resume(self): def resume(self):
"""Reprend les mouvement de toutes les entitées qui n'étaient pas lock avant l'appel de .pause()""" """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(): for e in self.get_all_entities():
@ -69,4 +68,4 @@ class EntityManager:
e.unlock() e.unlock()
self.paused = False self.paused = False
self.locked_before_pause = [] self.locked_before_pause = []

View file

@ -98,7 +98,7 @@ class EventHandler:
return x_value, y_value 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.""" """Vérifie s'il y a de nouvelles interactions et les traites."""
window_size = display.get_window_size() window_size = display.get_window_size()
@ -203,13 +203,13 @@ class EventHandler:
if self.engine.entity_manager.player_entity_name: if self.engine.entity_manager.player_entity_name:
if K_RIGHT in self.key_pressed: 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: 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: 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: 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: if K_SPACE in self.key_pressed:
self.engine.dialogs_manager.next_signal() self.engine.dialogs_manager.next_signal()
@ -221,7 +221,7 @@ class EventHandler:
if K_p in self.key_pressed: if K_p in self.key_pressed:
self.engine.renderer.emit_particles(math.floor(self.engine.entity_manager.get_by_name("player").x), 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), 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))
Review

?? Pk 60 ? La vitesse ? Si oui, PK LA VITESSE C'EST PAS SUR 100!!!!

?? Pk 60 ? La vitesse ? Si oui, PK LA VITESSE C'EST PAS SUR 100!!!!
Review

mais pk tu voudrais mettre 100 en vitesse, ça va aller presque 2 fois plus vite

mais pk tu voudrais mettre 100 en vitesse, ça va aller presque 2 fois plus vite
if K_o in self.key_pressed: if K_o in self.key_pressed:
print(f"Player pos: X = {self.engine.entity_manager.get_by_name('player').x} " 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}") f"Y = {self.engine.entity_manager.get_by_name('player').y}")

View file

@ -172,7 +172,7 @@ class Renderer:
# Conteur de FPS en mode DEBUG # Conteur de FPS en mode DEBUG
if self.engine.DEBUG_MODE: 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)) (0, 0))
player = self.engine.entity_manager.get_by_name('player') 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)}", self.window.blit(font.SysFont("Arial", 20).render(f"X: {round(player.x, 2)} Y:{round(player.y, 2)}",
@ -480,8 +480,8 @@ class Renderer:
draw.rect(rendered_surface, part[7], part_dest + (part[2], part[2])) draw.rect(rendered_surface, part[7], part_dest + (part[2], part[2]))
part[5] += delta part[5] += delta
part[0] += part[3] part[0] += part[3]*delta
part[1] += part[4] part[1] += part[4]*delta
if part[5] > part[6]: if part[5] > part[6]:
self.particles.remove(part) self.particles.remove(part)

View file

@ -72,7 +72,7 @@ class Game(Engine):
player.collision_rect = [-6, -7, 6, 16] player.collision_rect = [-6, -7, 6, 16]
player.set_default_life(15) player.set_default_life(15)
player.max_speed = 1.1 player.max_speed = 64.0
Review

POURQUOI 64 !!!!! MET SUR 100!!!!!

POURQUOI 64 !!!!! MET SUR 100!!!!!
Review

mais non pk tu veux 100 ?

mais non pk tu veux 100 ?
Review

Nan, tu le met sur 100 SUR

Nan, tu le met sur 100 SUR
self.entity_manager.set_player_entity("player") self.entity_manager.set_player_entity("player")
@ -95,7 +95,7 @@ class Game(Engine):
mob.collision_rect = [-15, -7, 12, 7] mob.collision_rect = [-15, -7, 12, 7]
mob.set_default_life(5) mob.set_default_life(5)
mob.max_speed = 1. mob.max_speed = 60.
Review

JE TE HAIS

JE TE HAIS
Review

car il faut qu'il soit presque à la même vitesse que le joueur mais que le joueur puisse fuire

car il faut qu'il soit presque à la même vitesse que le joueur mais que le joueur puisse fuire
Review

MET LE SUR 100!!!!!!

MET LE SUR 100!!!!!!
Review

pk ?

pk ?
Review

Psk c'est joli

Psk c'est joli
mob.x, mob.y = 1600, 16 mob.x, mob.y = 1600, 16