diff --git a/overcooked_simulator/game_items.py b/overcooked_simulator/game_items.py index b713fbfdab08d1e5cd666e4cd0fac8c79327753c..27ef0c50ecf3f26bd2f6a0133ac94709a0e7d2f9 100644 --- a/overcooked_simulator/game_items.py +++ b/overcooked_simulator/game_items.py @@ -1,8 +1,6 @@ class HoldableItem: """Base class for game items which can be held by a player.""" - pass - def can_combine(self, other): return False diff --git a/overcooked_simulator/main.py b/overcooked_simulator/main.py index b3fa9d422547a6355eb8e0b2a07b71e820b89c0e..33c5b91aefcc38609aa9544fdb1a1aeafd7674ff 100644 --- a/overcooked_simulator/main.py +++ b/overcooked_simulator/main.py @@ -5,7 +5,6 @@ import numpy as np import pygame from overcooked_simulator import ROOT_DIR -from overcooked_simulator.game_items import Tomato, Plate from overcooked_simulator.player import Player from overcooked_simulator.pygame_gui.pygame_gui import PyGameGUI from overcooked_simulator.simulation_runner import Simulator diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index 8245fafabcba77786f4b940edea04bfe8bc55224..c1f452f4da69eefca736f7d5172ed5f87808be8b 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -156,6 +156,8 @@ class Environment: The movement action is a unit 2d vector. + Detects collisions with other players and pushes them out of the way. + Args: player: The player to move. move_vector: The movement vector which is a unit-2d-vector of the movement direction @@ -165,6 +167,18 @@ class Environment: step = move_vector * player.move_dist player.move(step) if self.detect_collision(player): + collided_players = self.get_collided_players(player) + for collided_player in collided_players: + pushing_vector = collided_player.pos - player.pos + if np.linalg.norm(pushing_vector) != 0: + pushing_vector = pushing_vector / np.linalg.norm(pushing_vector) + + old_pos_other = collided_player.pos.copy() + collided_player.move(pushing_vector * (collided_player.move_dist / 2)) + if self.detect_collision_counters( + collided_player + ) or self.detect_collision_world_bounds(player): + collided_player.move_abs(old_pos_other) player.move_abs(old_pos) old_pos = player.pos.copy() @@ -196,11 +210,29 @@ class Environment: Returns: True if the player is intersecting with any object in the environment. """ return ( - self.detect_player_collision(player) + len(self.get_collided_players(player)) != 0 or self.detect_collision_counters(player) or self.detect_collision_world_bounds(player) ) + def get_collided_players(self, player: Player) -> list[Player]: + """Detects collisions between the queried player and other players. Returns the list of the collided players. + A player is modelled as a circle. Collision is detected if the distance between the players is smaller + than the sum of the radius's. + + Args: + player: The player to check collisions with other players for. + + Returns: The list of other players the player collides with. + + """ + other_players = filter(lambda p: p.name != player.name, self.players.values()) + + def collide(p): + return np.linalg.norm(player.pos - p.pos) <= (player.radius + p.radius) + + return list(filter(collide, other_players)) + def detect_player_collision(self, player: Player): """Detects collisions between the queried player and other players. A player is modelled as a circle. Collision is detected if the distance between the players is smaller