Source code for ezpygame.application
import pygame
[docs]class Application:
"""A simple wrapper around :mod:`pygame` for running games easily.
Also makes scene management seamless together with
the :class:`.Scene` class.
:param str|None title: title to display in the window's title bar
:param tuple[int,int]|None resolution: resolution of the game window
:param int|None update_rate: how many times per second to update
If any parameters are left to ``None``, these settings must be
defined either manually through ``application.<setting> = value``
or via :class:`.Scene`'s class variable settings.
Example usage:
.. code-block:: python
class Menu(ezpygame.Scene):
...
class Game(ezpygame.Scene):
...
app = ezpygame.Application(
title='My First EzPyGame Application',
resolution=(1280, 720),
update_rate=60,
)
main_menu = Menu()
app.run(main_menu)
"""
def __init__(self,
title=None,
resolution=None,
update_rate=None):
pygame.init()
self.update_rate = update_rate
self._scene = None
# Trigger property setters
self.title = title
self.resolution = resolution
@property
def title(self):
return pygame.display.get_caption()
@title.setter
def title(self, value):
pygame.display.set_caption(value)
@property
def resolution(self):
return self._screen.get_size()
@resolution.setter
def resolution(self, value):
self._screen = pygame.display.set_mode(value)
@property
def active_scene(self):
"""The currently active scene. Can be ``None``."""
return self._scene
[docs] def change_scene(self, scene):
"""Change the currently active scene.
This will invoke :meth:`.Scene.on_exit` and
:meth:`.Scene.on_enter` methods on the switching scenes.
If ``None`` is provided, the application's execution will end.
:param Scene|None scene: the scene to change into
"""
if self.active_scene is not None:
self.active_scene.on_exit(next_scene=scene)
self.active_scene._application = None
self._scene, old_scene = scene, self.active_scene
if self.active_scene is not None:
self.active_scene._application = self
self.active_scene.on_enter(previous_scene=old_scene)
[docs] def run(self, scene=None):
"""Execute the application.
:param scene.Scene|None scene: scene to start the execution from
"""
if scene is None:
if self.active_scene is None:
raise ValueError('No scene provided')
else:
self.change_scene(scene)
clock = pygame.time.Clock()
while self.active_scene is not None:
for event in pygame.event.get():
self.active_scene.handle_event(event)
if event.type == pygame.QUIT:
self.change_scene(None) # Trigger Scene.on_exit()
return
dt = clock.tick(self.update_rate)
self.active_scene.update(dt)
self.active_scene.draw(self._screen)
pygame.display.update()