From 475bc17e9d9ae050e644bc1d923aaa3351fa676b Mon Sep 17 00:00:00 2001 From: fheinrich <fheinrich@techfak.uni-bielefeld.de> Date: Thu, 7 Dec 2023 11:36:56 +0100 Subject: [PATCH] Added pushing other players around. --- overcooked_simulator/game_items.py | 2 -- overcooked_simulator/main.py | 1 - .../overcooked_environment.py | 34 ++++++++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/overcooked_simulator/game_items.py b/overcooked_simulator/game_items.py index b713fbfd..27ef0c50 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 b3fa9d42..33c5b91a 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 8245fafa..c1f452f4 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 -- GitLab