"""Main module for the game. Runs setting up the Pygame window and handles scene switching.""" import pygame import os import pocket_friends import importlib valid_surfaces = [ '_dev_menu', '_black_screen', '_error_screen', 'title', 'egg_select', 'selection_info', ] # Add all the surface modules to a dictionary for easy switching surface_modules = {} for module in valid_surfaces: if module[0] == '_': surface_modules[module] = importlib.import_module('pocket_friends._development.surfaces.{0}'.format(module)) else: surface_modules[module] = importlib.import_module('pocket_friends.surfaces.{0}'.format(module)) # FPS for the game to run at. game_fps = 16 # The internal resolution of the game game_res = 80 # Get the path for where all game resources are (images, fonts, sounds, etc.) script_dir = os.path.dirname(os.path.abspath(__file__)) resources_dir = script_dir + '/resources' # Makes Pygame draw on the display of the RPi. os.environ['SDL_FBDEV'] = '/dev/fb1' def start_game(resolution: int, dev: bool): """ Starts the game. Args: resolution: Resolution to display the game at. dev: Boolean to enable the developer menu at start or not """ pygame.init() # Hide the cursor for the Pi display. pygame.mouse.set_visible(False) if dev: starting_surface = '_dev_menu' else: starting_surface = 'title' window = pygame.display.set_mode((resolution, resolution)) surface = surface_modules.get(starting_surface).Surface((game_res, game_res), resources_dir, game_fps) # Only really useful for PCs. Does nothing on the Raspberry Pi. pygame.display.set_caption('Pocket Friends {0}'.format(pocket_friends.__version__)) # Add an icon to the pygame window. icon = pygame.image.load(resources_dir + '/icon/icon.png').convert_alpha() pygame.display.set_icon(icon) running = True while running: surface.update() # The game is only 80x80px, however it is upscaled to whatever the running resolution is. frame = pygame.transform.scale(surface, (resolution, resolution)) window.blit(frame, frame.get_rect()) # When the current surface is not running, check to make sure that the next surface will be valid if not surface.running: # Force the dev menu to appear if the flag has been passed if surface.dev_override: next_surface = '_dev_menu' else: next_surface = surface.next_surface # Send to the error screen if the given surface isn't a valid one if next_surface not in valid_surfaces: next_surface = '_error_screen' # Get the additional args to pass on from the ending surface to the next one additional_args = surface.additional_args # Create the new surface and pass through the additional argss surface = surface_modules.get(next_surface).Surface((game_res, game_res), resources_dir, game_fps, **additional_args) pygame.display.flip() pygame.quit()