From 2eb1ae02c589d09efb0d362334feb04dbd9f6736 Mon Sep 17 00:00:00 2001 From: Harriet O'Brien <42326843+harrietobrien@users.noreply.github.com> Date: Sat, 26 Aug 2023 13:02:08 -0400 Subject: [PATCH 1/2] setting up screens --- .DS_Store | Bin 0 -> 6148 bytes .idea/PracticalPython-PyGame.iml | 1 - common.py | 3 +- game.py | 10 +++ home.py | 35 ++++++++++ main.py | 113 +++++++++++++------------------ other.py | 10 +++ requirements.txt | 3 + settings.py | 10 +++ 9 files changed, 116 insertions(+), 69 deletions(-) create mode 100644 .DS_Store create mode 100644 game.py create mode 100644 home.py create mode 100644 other.py create mode 100644 settings.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..82aa3dae826994a5d7672b98c17b7ca588f8adb6 GIT binary patch literal 6148 zcmeHKu};G<5IvVvRCJ&N17pMoAXS2a1%)aMu=WEWZK18yl1k7bwy^L646OYbc98f8 zK7bG4o$Z31G_W9q&|PJ}+RybvAH=Gg>iS?>fM~z75fF|d(F0z;z zH0h-D%9zKltn3Lz>DA#6bvUWWp!A}EDBvrwVs0B;{}0R0|9+C(i2|a)zfwR2aXW6| zk!)=(JRH~B5bYF=jpH(dIt86A$NGXx@g|x!jD>swj4Wmb;ep8?0WE`cqQI{z@D7kQ BoOJ*I literal 0 HcmV?d00001 diff --git a/.idea/PracticalPython-PyGame.iml b/.idea/PracticalPython-PyGame.iml index 9919c40..8e5446a 100644 --- a/.idea/PracticalPython-PyGame.iml +++ b/.idea/PracticalPython-PyGame.iml @@ -2,7 +2,6 @@ - diff --git a/common.py b/common.py index 75a6d7c..334db30 100644 --- a/common.py +++ b/common.py @@ -1,7 +1,8 @@ import pygame as pg +import matplotlib.colors as mcl # Colors -COLORS = {"black": pg.Color('#000000')} #Perhaps more to come? +COLORS: dict = mcl.CSS4_COLORS # Tiles and Screen TILE_SIZE = 64 diff --git a/game.py b/game.py new file mode 100644 index 0000000..916e69d --- /dev/null +++ b/game.py @@ -0,0 +1,10 @@ +from common import COLORS, HEIGHT, WIDTH, FPS +from pygame_gui.core.interfaces.manager_interface import IUIManagerInterface + + +class Game: + def __init__(self, run): + self.run = run + print("Game starting.") + self.run.manager.clear_and_reset() + self.run.background.fill(COLORS["aqua"]) diff --git a/home.py b/home.py new file mode 100644 index 0000000..edd5157 --- /dev/null +++ b/home.py @@ -0,0 +1,35 @@ +import pygame as pg +import pygame_gui as gui +from common import COLORS, HEIGHT, WIDTH, FPS +from game import Game +from settings import Settings +from other import Other + + +class HomeScreen: + + def __init__(self, run): + self.run = run + self.home_screen() + + def home_screen(self): + self.set_buttons() + if self.run.buttons: + self.run.btn_dict = dict(zip(self.run.buttons, self.run.btn_class)) + + def set_buttons(self): + def offset_button(top_left): + padding = 80 + top_left[1] += padding + return top_left + + btn_width, btn_height = 100, 50 + top_left = [WIDTH // 2 - btn_width // 2, btn_height] + dimensions = (btn_width, btn_height) + button = pg.Rect(top_left, dimensions) + for btn_name in self.run.btn_names: + btn = gui.elements.UIButton(relative_rect=button, + text=btn_name, + manager=self.run.manager) + self.run.buttons.append(btn) + button = pg.Rect(offset_button(top_left), dimensions) diff --git a/main.py b/main.py index 70ad3c1..f905f29 100644 --- a/main.py +++ b/main.py @@ -1,61 +1,43 @@ import pygame as pg -import pygame_gui - +import pygame_gui as gui +from home import HomeScreen +from game import Game +from settings import Settings +from other import Other from common import COLORS, HEIGHT, WIDTH, FPS +from pygame_gui.core.interfaces.manager_interface import IUIManagerInterface -class RunGame: +class Run: def __init__(self): - self.clock = pg.time.Clock() + self.pg, self.gui = pg, gui + self.pg.init() + self.game_state = HomeScreen + self.clock = self.pg.time.Clock() self.screen_size = (WIDTH, HEIGHT) + self.btn_names = ['START', 'SETTINGS', 'OTHER'] + self.btn_class = [Game, Settings, Other] self.buttons = list() self.init_ui() + self.events = self.get_events() self.game_loop() - def init_ui(self): - pg.init() - pg.display.set_caption('Quick Start') - self.window_surface = pg.display.set_mode(self.screen_size) - self.background = pg.Surface(self.screen_size) + self.window_surface = self.pg.display.set_mode(self.screen_size) + self.background = self.pg.Surface(self.screen_size) self.background.fill(COLORS["black"]) - - self.manager = pygame_gui.UIManager(self.screen_size) - - self.set_buttons() - - - def set_buttons(self): - def offset_button(top_left): - padding = 80 - top_left[1] += padding - return top_left - - btn_width, btn_height = 100, 50 - top_left = [WIDTH//2 - btn_width//2, btn_height] - dimensions = (btn_width, btn_height) - - self.button = pg.Rect(top_left, dimensions) - self.btn_names = ['START', 'SETTINGS', 'OTHER'] - for btn_name in self.btn_names: - btn = pygame_gui.elements.UIButton(relative_rect=self.button, - text=btn_name, - manager=self.manager) - self.buttons.append(btn) - self.button = pg.Rect(offset_button(top_left), dimensions) - + self.manager = self.gui.UIManager(self.screen_size) def get_events(self): """ Returns necessary events for application. Packed in a dictionary. """ - events = pg.event.get() - mouse_press = pg.mouse.get_pressed() - keys = pg.key.get_pressed() - mouse_pos = pg.mouse.get_pos() + events = self.pg.event.get() + mouse_press = self.pg.mouse.get_pressed() + keys = self.pg.key.get_pressed() + mouse_pos = self.pg.mouse.get_pos() raw_dt = self.clock.get_time() dt = raw_dt * FPS - return { "events": events, "mouse press": mouse_press, @@ -65,40 +47,37 @@ def get_events(self): "dt": dt, } - + def event_handler(self, running): + for event in self.events["events"]: + if event.type == self.pg.QUIT: + return not running + if (event.type == self.gui.UI_BUTTON_PRESSED + and self.buttons): + for btn in self.buttons: + if event.ui_element == btn: + self.game_state = self.btn_dict[btn] + self.manager.process_events(event) + def game_loop(self): - is_running = True - while is_running: - - #time_delta = clock.tick(FPS) / 1000.0 - self.clock.tick(FPS) - - events = self.get_events() - - time_delta = events["dt"] - - for event in events["events"]: - if event.type == pg.QUIT: - is_running = False - - if event.type == pygame_gui.UI_BUTTON_PRESSED: - for btn in self.buttons: - if event.ui_element == btn: - print('Hello World!') - - self.manager.process_events(event) - + time_delta = self.events["dt"] + self.events = self.get_events() + tmp = self.event_handler(is_running) + # return: bool if event == self.pg.QUIT + if tmp is not None: + is_running = tmp + if self.game_state == HomeScreen: + HomeScreen(self) + else: # state changed on button press + run = self.game_state + run(self) self.manager.update(time_delta) - self.window_surface.blit(self.background, (0, 0)) self.manager.draw_ui(self.window_surface) - - pg.display.update() + self.pg.display.update() -RunGame() -# Close pygame -pg.quit() \ No newline at end of file +Run() +pg.quit() diff --git a/other.py b/other.py new file mode 100644 index 0000000..e05de17 --- /dev/null +++ b/other.py @@ -0,0 +1,10 @@ +from common import COLORS, HEIGHT, WIDTH, FPS + + +class Other: + + def __init__(self, run): + self.run = run + print("Hello from the other side.") + self.run.manager.clear_and_reset() + self.run.background.fill(COLORS["yellowgreen"]) diff --git a/requirements.txt b/requirements.txt index c597399..6bad4f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,6 @@ pygame==2.5.1 pygame-ce==2.3.1 pygame-gui==0.6.9 python-i18n==0.3.9 + +colour~=0.1.5 +matplotlib \ No newline at end of file diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..bd48e6a --- /dev/null +++ b/settings.py @@ -0,0 +1,10 @@ +from common import COLORS, HEIGHT, WIDTH, FPS + + +class Settings: + + def __init__(self, run): + self.run = run + print("Hello from settings.") + self.run.manager.clear_and_reset() + self.run.background.fill(COLORS["magenta"]) From 85fd9b3c2ef8c91d04da5ec2e55b65ccf1c0993e Mon Sep 17 00:00:00 2001 From: Harriet O'Brien <42326843+harrietobrien@users.noreply.github.com> Date: Sat, 26 Aug 2023 15:51:33 -0400 Subject: [PATCH 2/2] screens w/o pg as an instance attribute --- main.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index f905f29..64afd57 100644 --- a/main.py +++ b/main.py @@ -10,10 +10,9 @@ class Run: def __init__(self): - self.pg, self.gui = pg, gui - self.pg.init() + pg.init() self.game_state = HomeScreen - self.clock = self.pg.time.Clock() + self.clock = pg.time.Clock() self.screen_size = (WIDTH, HEIGHT) self.btn_names = ['START', 'SETTINGS', 'OTHER'] self.btn_class = [Game, Settings, Other] @@ -23,19 +22,19 @@ def __init__(self): self.game_loop() def init_ui(self): - self.window_surface = self.pg.display.set_mode(self.screen_size) - self.background = self.pg.Surface(self.screen_size) + self.window_surface = pg.display.set_mode(self.screen_size) + self.background = pg.Surface(self.screen_size) self.background.fill(COLORS["black"]) - self.manager = self.gui.UIManager(self.screen_size) + self.manager = gui.UIManager(self.screen_size) def get_events(self): """ Returns necessary events for application. Packed in a dictionary. """ - events = self.pg.event.get() - mouse_press = self.pg.mouse.get_pressed() - keys = self.pg.key.get_pressed() - mouse_pos = self.pg.mouse.get_pos() + events = pg.event.get() + mouse_press = pg.mouse.get_pressed() + keys = pg.key.get_pressed() + mouse_pos = pg.mouse.get_pos() raw_dt = self.clock.get_time() dt = raw_dt * FPS return { @@ -49,9 +48,9 @@ def get_events(self): def event_handler(self, running): for event in self.events["events"]: - if event.type == self.pg.QUIT: + if event.type == pg.QUIT: return not running - if (event.type == self.gui.UI_BUTTON_PRESSED + if (event.type == gui.UI_BUTTON_PRESSED and self.buttons): for btn in self.buttons: if event.ui_element == btn: @@ -76,7 +75,7 @@ def game_loop(self): self.manager.update(time_delta) self.window_surface.blit(self.background, (0, 0)) self.manager.draw_ui(self.window_surface) - self.pg.display.update() + pg.display.update() Run()