From 39272a2b86d1f7f06151918b3cf251f913a713d2 Mon Sep 17 00:00:00 2001 From: fheinrich <fheinrich@techfak.uni-bielefeld.de> Date: Tue, 16 Jan 2024 13:14:38 +0100 Subject: [PATCH] Remaining game time is displayed from state --- .../game_content/environment_config.yaml | 2 +- .../gui_2d_vis/overcooked_gui.py | 36 ++++++++++++++----- .../overcooked_environment.py | 2 ++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml index 48d23d2e..4b3a9c26 100644 --- a/overcooked_simulator/game_content/environment_config.yaml +++ b/overcooked_simulator/game_content/environment_config.yaml @@ -4,4 +4,4 @@ plates: plate_delay: [ 5, 10 ] game: - time_limit_seconds: 10.0 + time_limit_seconds: 5.0 diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py index 33990634..f50124a1 100644 --- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py +++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py @@ -3,6 +3,7 @@ import logging import math import sys from collections import deque +from datetime import timedelta from enum import Enum import numpy as np @@ -484,6 +485,16 @@ class PyGameGUI: if SHOW_COUNTER_CENTERS: pygame.draw.circle(self.game_screen, colors["green1"], counter.pos, 3) + def update_score_label(self, state): + score = state["score"] + self.score_label.set_text(f"Your Score is {score}") + + def draw_time(self, remaining_time: timedelta): + hours, rem = divmod(remaining_time.seconds, 3600) + minutes, seconds = divmod(rem, 60) + display_time = f"{minutes}:{'%02d' % seconds}" + self.timer_label.set_text(f"Time remaining: {display_time}") + def draw(self, state): """Main visualization function. @@ -495,7 +506,8 @@ class PyGameGUI: self.draw_counters(state) self.draw_players(state) - self.manager.draw_ui(self.game_screen) + self.manager.draw_ui(self.main_window) + self.draw_time(state["passed_time"]) def init_ui_elements(self): self.manager = pygame_gui.UIManager((self.window_width, self.window_height)) @@ -588,6 +600,16 @@ class PyGameGUI: starting_option=layout_file_paths[-1], ) + self.timer_label = pygame_gui.elements.UILabel( + text="GAMETIME", + relative_rect=pygame.Rect( + (0, 0), + (button_width, button_height), + ), + manager=self.manager, + object_id="#timer_label", + ) + def setup_windows(self): ( self.window_width, @@ -629,21 +651,21 @@ class PyGameGUI: self.score_label.hide() self.finished_button.hide() self.layout_selection.show() + self.timer_label.hide() case MenuStates.Game: self.start_button.hide() self.back_button.show() self.score_label.hide() self.finished_button.show() self.layout_selection.hide() + self.timer_label.show() case MenuStates.End: self.start_button.hide() self.back_button.show() self.score_label.show() - self.score_label.set_text( - f"Your Score is {self.simulator.env.game_score.score}" - ) self.finished_button.hide() self.layout_selection.hide() + self.timer_label.hide() def start_button_press(self): self.menu_state = MenuStates.Game @@ -696,6 +718,7 @@ class PyGameGUI: while self.running: try: time_delta = clock.tick(self.FPS) / 1000.0 + state = self.simulator.get_state() for event in pygame.event.get(): if event.type == pygame.QUIT: @@ -734,7 +757,6 @@ class PyGameGUI: self.handle_keys() - state = self.simulator.get_state() if state["ended"]: self.finished_button_press() self.manage_button_visibility() @@ -749,9 +771,7 @@ class PyGameGUI: self.main_window.blit(self.game_screen, game_screen_rect) case MenuStates.End: - pygame.draw.rect( - self.game_screen, colors["cornsilk1"], self.score_rect - ) + self.update_score_label(state) self.manager.update(time_delta) pygame.display.flip() diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py index 64ad2252..59ed6bfd 100644 --- a/overcooked_simulator/overcooked_environment.py +++ b/overcooked_simulator/overcooked_environment.py @@ -134,6 +134,7 @@ class Environment: self.score: int = 0 self.env_time = create_init_env_time() + self.beginning_time = self.env_time self.env_time_end = self.env_time + timedelta( seconds=environment_config["game"]["time_limit_seconds"] ) @@ -462,6 +463,7 @@ class Environment: "counters": self.counters, "score": self.score, "ended": self.game_ended, + "passed_time": self.env_time_end - self.env_time, } def get_state_json(self): -- GitLab