From 3467b47ace3c0f90f592b2868ae6a5d2cb97f489 Mon Sep 17 00:00:00 2001 From: Lucas James Date: Wed, 19 Sep 2018 11:45:27 +0100 Subject: [PATCH 1/3] Added pause functionality --- examples/asteroids/main.py | 5 ++++- pgzero/builtins.py | 2 +- pgzero/game.py | 13 ++++++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/examples/asteroids/main.py b/examples/asteroids/main.py index 86721639..b77e836e 100644 --- a/examples/asteroids/main.py +++ b/examples/asteroids/main.py @@ -3,6 +3,7 @@ import operator from pygame.math import Vector2 +from pgzero.builtins import pause, is_paused from space import create_star_scape from actors import Player, Asteroid @@ -139,9 +140,11 @@ def on_key_down(key): game.player.turn += 1 if key == keys.RIGHT: game.player.turn -= 1 - if key == keys.SPACE and not game.player.frozen: + if key == keys.SPACE and not game.player.frozen and not is_paused(): sounds.fire.play() game.bullets.append(game.player.fire()) + if key == keys.RETURN: + pause() elif game.stage is GameStage.game_over: if key == keys.BACKSPACE: game.initials = game.initials[:-1] diff --git a/pgzero/builtins.py b/pgzero/builtins.py index 58bd21f8..a223b2d5 100644 --- a/pgzero/builtins.py +++ b/pgzero/builtins.py @@ -11,4 +11,4 @@ from .constants import mouse, keys, keymods -from .game import exit +from .game import exit, pause, is_paused diff --git a/pgzero/game.py b/pgzero/game.py index 33759e1d..db8ea05c 100644 --- a/pgzero/game.py +++ b/pgzero/game.py @@ -13,7 +13,14 @@ screen = None DISPLAY_FLAGS = 0 +paused = False +def pause(): + global paused + paused = not paused + +def is_paused(): + return paused def exit(): """Wait for up to a second for all sounds to play out @@ -243,7 +250,7 @@ def mainloop(self): pgzclock = pgzero.clock.clock - self.need_redraw = True + self.need_redraw = not paused while True: # TODO: Use asyncio.sleep() for frame delay if accurate enough yield from asyncio.sleep(0) @@ -261,9 +268,9 @@ def mainloop(self): self.keyboard._release(event.key) self.dispatch_event(event) - pgzclock.tick(dt) - if update: + if update and not paused: + pgzclock.tick(dt) update(dt) screen_change = self.reinit_screen() From 9afb94d38fe5f83ab8576ffea28a7c17a979762b Mon Sep 17 00:00:00 2001 From: Lucas James Date: Wed, 19 Sep 2018 14:28:33 +0100 Subject: [PATCH 2/3] Updated pause functionality, in accordance with PR comments Moving the logic for need_redraw to more relevant places --- examples/asteroids/main.py | 1 - pgzero/game.py | 23 +++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/examples/asteroids/main.py b/examples/asteroids/main.py index b77e836e..0a48b770 100644 --- a/examples/asteroids/main.py +++ b/examples/asteroids/main.py @@ -3,7 +3,6 @@ import operator from pygame.math import Vector2 -from pgzero.builtins import pause, is_paused from space import create_star_scape from actors import Player, Asteroid diff --git a/pgzero/game.py b/pgzero/game.py index db8ea05c..09cfe5ae 100644 --- a/pgzero/game.py +++ b/pgzero/game.py @@ -77,6 +77,7 @@ def reinit_screen(self): w = getattr(mod, 'WIDTH', 800) h = getattr(mod, 'HEIGHT', 600) if w != self.width or h != self.height: + self.need_redraw = True self.screen = pygame.display.set_mode((w, h), DISPLAY_FLAGS) if hasattr(self.mod, 'screen'): self.mod.screen.surface = self.screen @@ -199,9 +200,13 @@ def get_update_func(self): except AttributeError: return None else: - if update.__code__.co_argcount == 0: - return lambda dt: update() - return update + def update_wrapper(dt): + if update.__code__.co_argcount == 0: + update() + else: + update(dt) + self.need_redraw = True + return update_wrapper def get_draw_func(self): """Get a draw function. @@ -250,7 +255,7 @@ def mainloop(self): pgzclock = pgzero.clock.clock - self.need_redraw = not paused + self.need_redraw = True while True: # TODO: Use asyncio.sleep() for frame delay if accurate enough yield from asyncio.sleep(0) @@ -268,13 +273,15 @@ def mainloop(self): self.keyboard._release(event.key) self.dispatch_event(event) - - if update and not paused: + if not paused: pgzclock.tick(dt) - update(dt) + + if update: + update(dt) + screen_change = self.reinit_screen() - if screen_change or update or pgzclock.fired or self.need_redraw: + if pgzclock.fired or self.need_redraw: draw() pygame.display.flip() self.need_redraw = False From b75ec72be44f3cc13f40dd7e20482199be948145 Mon Sep 17 00:00:00 2001 From: Lucas James Date: Wed, 19 Sep 2018 15:33:41 +0100 Subject: [PATCH 3/3] Removed redundant code --- pgzero/game.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pgzero/game.py b/pgzero/game.py index 09cfe5ae..4aa00a9c 100644 --- a/pgzero/game.py +++ b/pgzero/game.py @@ -63,7 +63,6 @@ def reinit_screen(self): """ global screen - changed = False mod = self.mod icon = getattr(self.mod, 'ICON', DEFAULTICON) @@ -92,8 +91,6 @@ def reinit_screen(self): pygame.display.set_caption(title) self.title = title - return changed - @staticmethod def show_default_icon(): """Show a default icon loaded from Pygame Zero resources.""" @@ -280,7 +277,7 @@ def mainloop(self): update(dt) - screen_change = self.reinit_screen() + self.reinit_screen() if pgzclock.fired or self.need_redraw: draw() pygame.display.flip()