From 0cb6610445e969ad8937e50d18d39a98645443ed Mon Sep 17 00:00:00 2001 From: yannis300307 Date: Tue, 26 Dec 2023 09:58:19 +0100 Subject: [PATCH] Ajout des collisions dans les mouvements --- src/entity.py | 43 ++++++++++++++++++++++++++++++++----------- src/event_handler.py | 8 ++++---- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/entity.py b/src/entity.py index 03ab3d9..9322178 100644 --- a/src/entity.py +++ b/src/entity.py @@ -8,7 +8,7 @@ class Entity: self.x = 8 self.y = 8 - self.collision_rect = [-7, -7, 20, 20] # x1, y1, x2, y2 + self.collision_rect = [-7, -7, 40, 40] # x1, y1, x2, y2 # Time utilisé pour les IA self.time = 0 @@ -23,22 +23,43 @@ class Entity: self.time += delta + def get_collisions(self, x: float, y: float, map_manager: MapManager): + """Calcule les collisions.""" + # Pour les collisions, on utilise le layer 1 (le deuxième) + + top_left_corner_tile = (int((x + self.collision_rect[0]) / 16), + int((y + self.collision_rect[1]) / 16)) + top_right_corner_tile = (int((x + self.collision_rect[2]) / 16), + int((y + self.collision_rect[1]) / 16)) + + bottom_left_corner_tile = (int((x + self.collision_rect[0]) / 16), + int((y + self.collision_rect[3]) / 16)) + bottom_right_corner_tile = (int((x + self.collision_rect[2]) / 16), + int((y + self.collision_rect[3]) / 16)) + + collision = False + + for xx in range(top_left_corner_tile[0], bottom_right_corner_tile[0]+1): + for yy in range(top_left_corner_tile[1], bottom_right_corner_tile[1]+1): + tile = map_manager.get_tile_at(xx, yy, 1) + if tile != 0: + collision = True + + return collision + def move(self, x: float, y: float, map_manager: MapManager): """Fait bouger l'entité en tenant compte des collisions.""" - # Pour les collisions, on utilise le layer 1 (le deuxième) + collision_x = self.get_collisions(self.x + x, self.y, map_manager) + collision_y = self.get_collisions(self.x, self.y + y, map_manager) - top_left_corner_tile = (int((self.x + x + self.collision_rect[0]) / 16), - int((self.y + y + self.collision_rect[1]) / 16)) - top_right_corner_tile = (int((self.x + x + self.collision_rect[2]) / 16), - int((self.y + y + self.collision_rect[1]) / 16)) + if not collision_x: + self.x += x + if not collision_y: + self.y += y - bottom_left_corner_tile = (int((self.x + x + self.collision_rect[0]) / 16), - int((self.y + y + self.collision_rect[3]) / 16)) - bottom_right_corner_tile = (int((self.x + x + self.collision_rect[2]) / 16), - int((self.y + y + self.collision_rect[3]) / 16)) - print(top_left_corner_tile, top_right_corner_tile, bottom_left_corner_tile, bottom_right_corner_tile) + #print(top_left_corner_tile, top_right_corner_tile, bottom_left_corner_tile, bottom_right_corner_tile) def link_animation(self, name: str): self.animation_name = name diff --git a/src/event_handler.py b/src/event_handler.py index ea7a261..34c2f98 100644 --- a/src/event_handler.py +++ b/src/event_handler.py @@ -24,13 +24,13 @@ class EventHandler: player = self.engine.entity_manager.get_by_name("player") if K_RIGHT in self.key_pressed: - player.x += 2 + player.move(2, 0, self.engine.map_manager) if K_LEFT in self.key_pressed: - player.x -= 2 + player.move(-2, 0, self.engine.map_manager) if K_UP in self.key_pressed: - player.y -= 2 + player.move(0, -2, self.engine.map_manager) if K_DOWN in self.key_pressed: - player.y += 2 + player.move(0, 2, self.engine.map_manager) if K_x in self.key_pressed: self.engine.camera.target_zoom *= 1.01 if K_c in self.key_pressed: