pocket-friends/pocket_friends/game.py

96 lines
3.1 KiB
Python
Raw Normal View History

2023-05-15 01:04:45 -04:00
"""Main module for the game. Runs setting up the Pygame window and handles scene switching."""
2023-05-11 11:51:51 -04:00
import pygame
import os
import pocket_friends
import importlib
valid_surfaces = [
2023-05-14 23:04:26 -04:00
'_dev_menu',
'_black_screen',
'_error_screen',
'title',
2023-05-11 15:24:17 -04:00
'egg_select',
2023-05-12 17:34:13 -04:00
'selection_info',
]
# Add all the surface modules to a dictionary for easy switching
2023-05-14 23:04:26 -04:00
surface_modules = {}
for module in valid_surfaces:
2023-05-14 23:04:26 -04:00
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.
2023-05-11 11:51:51 -04:00
game_fps = 16
# The internal resolution of the game
2023-05-11 11:51:51 -04:00
game_res = 80
# Get the path for where all game resources are (images, fonts, sounds, etc.)
2023-05-11 11:51:51 -04:00
script_dir = os.path.dirname(os.path.abspath(__file__))
resources_dir = script_dir + '/resources'
2023-05-11 12:20:07 -04:00
# Makes Pygame draw on the display of the RPi.
2023-05-13 11:47:48 -04:00
os.environ['SDL_FBDEV'] = '/dev/fb1'
2023-05-11 11:51:51 -04:00
2023-05-15 01:04:45 -04:00
def start_game(resolution: int, dev: bool):
2023-05-11 11:51:51 -04:00
"""
Starts the game.
Args:
2023-05-15 01:04:45 -04:00
resolution: Resolution to display the game at.
dev: Boolean to enable the developer menu at start or not
2023-05-11 11:51:51 -04:00
"""
pygame.init()
2023-05-13 09:49:51 -04:00
# Hide the cursor for the Pi display.
pygame.mouse.set_visible(False)
2023-05-12 23:55:06 -04:00
if dev:
starting_surface = '_dev_menu'
else:
starting_surface = 'title'
window = pygame.display.set_mode((resolution, resolution))
2023-05-13 10:17:30 -04:00
surface = surface_modules.get(starting_surface).Surface((game_res, game_res), resources_dir, game_fps)
2023-05-13 09:49:51 -04:00
# Only really useful for PCs. Does nothing on the Raspberry Pi.
2023-05-13 09:49:51 -04:00
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()
2023-05-11 11:51:51 -04:00
pygame.display.set_icon(icon)
running = True
2023-05-11 12:20:07 -04:00
while running:
2023-05-13 10:17:30 -04:00
surface.update()
# The game is only 80x80px, however it is upscaled to whatever the running resolution is.
frame = pygame.transform.scale(surface, (resolution, resolution))
2023-05-11 12:20:07 -04:00
window.blit(frame, frame.get_rect())
# When the current surface is not running, check to make sure that the next surface will be valid
2023-05-13 10:17:30 -04:00
if not surface.running:
# Force the dev menu to appear if the flag has been passed
if surface.dev_override:
2023-05-14 23:04:26 -04:00
next_surface = '_dev_menu'
else:
next_surface = surface.next_surface
# Send to the error screen if the given surface isn't a valid one
2023-05-13 10:17:30 -04:00
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
2023-05-13 10:17:30 -04:00
surface = surface_modules.get(next_surface).Surface((game_res, game_res), resources_dir,
game_fps, **additional_args)
2023-05-11 12:20:07 -04:00
pygame.display.flip()
2023-05-11 11:51:51 -04:00
pygame.quit()