diff --git a/compile.py b/compile.py index c46b9b8..47c4954 100644 --- a/compile.py +++ b/compile.py @@ -4,7 +4,7 @@ import pocket_friends script_dir = os.path.dirname(os.path.abspath(__file__)) -PyInstaller.__main__.run([ +PyInstaller.__main__.preprocess([ '{0}/pocket_friends/__main__.py'.format(script_dir), '--clean', '--noconsole', diff --git a/pocket_friends/development/menus.py b/pocket_friends/development/menus.py index 45cd56b..6e8d62d 100644 --- a/pocket_friends/development/menus.py +++ b/pocket_friends/development/menus.py @@ -63,7 +63,7 @@ class Menu: :param kwargs: keyword arguments to be passed to the function """ try: - return self._options[self._selection].run(*args, **kwargs) + return self._options[self._selection].preprocess(*args, **kwargs) except IndexError as ex: raise Exception('menu has no options, cannot run a non-existent option') from ex diff --git a/pocket_friends/game_files/elements/surface.py b/pocket_friends/game_files/elements/surface.py new file mode 100644 index 0000000..663f499 --- /dev/null +++ b/pocket_friends/game_files/elements/surface.py @@ -0,0 +1,46 @@ +"""Module to aid in the drawing of surfaces to make switching from one screen to another easier.""" +import pygame +from ..io.input_handler import InputHandler + + +class GameSurface(pygame.Surface): + """ + Class to be used as the backbone of all game surfaces. + Attributes: + running (bool): Boolean to tell whether the surface is running or not. + next_surface (:obj:`str`): What the next surface should be after halting. + resource_dir (:obj:`str`): The path of the game's main resource directory. + game_fps (int): How many frames per second the game will run at. + additional_args (dict): Additional arguments to send to the next surface after halting. + """ + def __init__(self, game_res, resources_dir, game_fps): + """ + Create a GameSurface object. + Args: + game_res (int): The internal resolution of the surface. + resources_dir (:obj:`str`): The path of the game's main resource directory. + game_fps: (int): How many frames per second the game will run at. + """ + super().__init__(game_res, pygame.SRCALPHA) + self.running = True + self.next_surface = None + self.resource_dir = resources_dir + self._clock = pygame.time.Clock() + self.game_fps = game_fps + self._input_handler = InputHandler(self._clock) + self.additional_args = {} + + self._bg = pygame.image.load(self.resource_dir + '/images/bg.png').convert_alpha() + self.sprites = pygame.sprite.Group() + + def preprocess(self): + """ + Advance the surface by one frame and draw the background. + """ + self._clock.tick(self.game_fps) + + self.blit(self._bg, (0, 0)) + self.sprites.update() + self.sprites.draw(self) + + self._input_handler.update() diff --git a/pocket_friends/game_files/surfaces/egg_select.py b/pocket_friends/game_files/surfaces/egg_select.py index 50f097d..bc8edcf 100644 --- a/pocket_friends/game_files/surfaces/egg_select.py +++ b/pocket_friends/game_files/surfaces/egg_select.py @@ -1,22 +1,9 @@ import pygame -from ..elements import sprites -from ..io.input_handler import InputHandler +from ..elements import sprites, surface - -class Surface(pygame.Surface): - def __init__(self, window_size, resources_dir, game_fps, **kwargs): - super().__init__(window_size, pygame.SRCALPHA) - self.name = 'egg_select' - self.running = True - self.next_surface = None - self.resource_dir = resources_dir - self.clock = pygame.time.Clock() - self.game_fps = game_fps - self.input_handler = InputHandler(self.clock) - self.additional_args = {} - - self.bg = pygame.image.load(self.resource_dir + '/images/bg.png').convert_alpha() - self.sprites = pygame.sprite.Group() +class Surface(surface.GameSurface): + def __init__(self, game_res, resources_dir, game_fps, **kwargs): + super().__init__(game_res, resources_dir, game_fps) preselected_color = None for key in kwargs.keys(): @@ -116,13 +103,7 @@ class Surface(pygame.Surface): self.selected_egg += self.eggs_per_row def update(self): - self.clock.tick(self.game_fps) - - self.blit(self.bg, (0, 0)) - self.sprites.update() - self.sprites.draw(self) - - self.input_handler.update() + self.preprocess() cursor = pygame.image.load( self.resource_dir + '/images/gui/egg_selector.png').convert_alpha() diff --git a/pocket_friends/game_files/surfaces/error_screen.py b/pocket_friends/game_files/surfaces/error_screen.py index b0e0551..026a12a 100644 --- a/pocket_friends/game_files/surfaces/error_screen.py +++ b/pocket_friends/game_files/surfaces/error_screen.py @@ -1,29 +1,21 @@ import pygame - +from ..elements import surface from pocket_friends.game_files.io.input_handler import InputHandler -class Surface(pygame.Surface): - def __init__(self, window_size, resources_dir, game_fps, **kwargs): - super().__init__(window_size, pygame.SRCALPHA) - self.name = 'error_screen' - self.running = True - self.next_surface = 'title' - self.clock = pygame.time.Clock() - self.input_handler = InputHandler(self.clock) - self.additional_args = {} - - self.bg = pygame.image.load(resources_dir + '/images/bg.png').convert_alpha() - self.title = pygame.image.load(resources_dir + '/images/debug/invalid.png').convert_alpha() +class Surface(surface.GameSurface): + def __init__(self, game_res, resources_dir, game_fps, **kwargs): + super().__init__(game_res, resources_dir, game_fps) self.frames = 1 self.game_fps = game_fps self.delay = 1 self.font = pygame.font.Font(resources_dir + '/fonts/5Pts5.ttf', 10) + self.title = pygame.image.load(resources_dir + '/images/debug/invalid.png').convert_alpha() + self.next_surface = 'title' def update(self): - self.clock.tick(self.game_fps) + self.preprocess() - self.blit(self.bg, (0, 0)) self.blit(self.title, (0, -4)) text = self.font.render('Frames: {0}'.format(self.frames), False, (64, 64, 64)) self.blit(text, (3, 68)) @@ -31,8 +23,6 @@ class Surface(pygame.Surface): self.frames += 1 self.frames %= self.game_fps - self.input_handler.update() - for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_b: diff --git a/pocket_friends/game_files/surfaces/selection_info.py b/pocket_friends/game_files/surfaces/selection_info.py index 2e69572..071c6f4 100644 --- a/pocket_friends/game_files/surfaces/selection_info.py +++ b/pocket_friends/game_files/surfaces/selection_info.py @@ -1,33 +1,16 @@ import pygame -from ..elements import sprites +from ..elements import sprites, surface from ..io.input_handler import InputHandler -class Surface(pygame.Surface): - """ +class Surface(surface.GameSurface): + def __init__(self, game_res, resources_dir, game_fps, **kwargs): + super().__init__(game_res, resources_dir, game_fps) - """ - def __init__(self, window_size, resources_dir, game_fps, **kwargs): - """ - - Args: - window_size: - resources_dir: - game_fps: - **kwargs: - """ - super().__init__(window_size, pygame.SRCALPHA) - self.name = 'selection_info' - self.running = True - self.next_surface = None - self.resource_dir = resources_dir - self.clock = pygame.time.Clock() - self.game_fps = game_fps - self.input_handler = InputHandler(self.clock) - self.additional_args = {} - - self.bg = pygame.image.load(self.resource_dir + '/images/bg.png').convert_alpha() - self.sprites = pygame.sprite.Group() + preselected_color = None + for key in kwargs.keys(): + if key == 'selected_color': + preselected_color = kwargs.get(key) self.selected_egg = None for key in kwargs.keys(): @@ -39,20 +22,15 @@ class Surface(pygame.Surface): egg.rect.y = 3 self.sprites.add(egg) - self.info_text = sprites.InfoText(resources_dir, window_size[0], egg.description) + self.info_text = sprites.InfoText(resources_dir, game_res[0], egg.description) self.info_icons = sprites.EggInfo(resources_dir, egg.contentedness, egg.metabolism, (32, 4)) def update(self): - self.clock.tick(self.game_fps) + self.preprocess() - self.blit(self.bg, (0, 0)) - self.sprites.update() - self.sprites.draw(self) self.info_text.draw(self) self.info_icons.draw(self) - self.input_handler.update() - for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: diff --git a/pocket_friends/game_files/surfaces/title.py b/pocket_friends/game_files/surfaces/title.py index 350063e..9f05801 100644 --- a/pocket_friends/game_files/surfaces/title.py +++ b/pocket_friends/game_files/surfaces/title.py @@ -1,26 +1,24 @@ import pygame +from ..elements import surface -class Surface(pygame.Surface): - def __init__(self, window_size, resources_dir, game_fps): - super().__init__(window_size, pygame.SRCALPHA) - self.name = 'title' - self.running = True - self.next_surface = None - self.clock = pygame.time.Clock() - self.additional_args = {} +class Surface(surface.GameSurface): + def __init__(self, game_res, resources_dir, game_fps): + super().__init__(game_res, resources_dir, game_fps) - self.bg = pygame.image.load(resources_dir + '/images/bg.png').convert_alpha() - self.title = pygame.image.load(resources_dir + '/images/title.png').convert_alpha() - self.frames = 1 - self.game_fps = game_fps + self.frames = 0 self.delay = 1 + self.title = pygame.image.load(resources_dir + '/images/title.png').convert_alpha() + def update(self): - self.clock.tick(self.game_fps) - self.blit(self.bg, (0, 0)) + """ + Advance the surface logic by one frame. + """ + self.preprocess() self.blit(self.title, (0, 0)) + print(self.frames) self.frames += 1 if self.frames > self.game_fps * self.delay: self.next_surface = 'egg_select'