import pygame
import os
# Simple interface
class State:
states = {}
def __init__(self, state_name=None, keep_alive=True):
if keep_alive:
if state_name is None:
state_name = self.__class__.__name__
State.states[state_name] = self
def draw(self, surface):
surface.fill(pygame.Color('gray40'))
def drop(self):
pass
def event(self, event):
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
StateMachine.running = False
elif event.type == pygame.QUIT:
StateMachine.running = False
def focus(self, *args, **kwargs):
pass
def new(self, *args, **kwargs):
pass
def update(self, delta, ticks):
pass
# Simple static pygame setup
class StateMachine:
@classmethod
def setup(cls, caption, width, height):
# basic pygame setup
pygame.display.set_caption(caption)
cls.surface = pygame.display.set_mode((width, height))
cls.rect = cls.surface.get_rect()
cls.clock = pygame.time.Clock()
cls.running = False
cls.ticks = 0
cls.delta = 0
cls.fps = 30
# State
cls._state = State()
# Add extension callbacks
cls.extension = []
@classmethod
def _flip(cls, state_name, new=False, *args, **kwargs):
cls._state.drop()
if isinstance(state_name, State):
cls._state = state_name
else:
cls._state = State.states[state_name]
if new:
cls._state.new(*args, **kwargs)
else:
cls._state.focus(*args, **kwargs)
@classmethod
def flip(cls, state_name, *args, **kwargs):
cls._flip(state_name, False, *args, **kwargs)
@classmethod
def flip_new(cls, state_name, *args, **kwargs):
cls._flip(state_name, True, *args, **kwargs)
@classmethod
def mainloop(cls):
cls.running = True
while cls.running:
cls.ticks = pygame.time.get_ticks()
for event in pygame.event.get():
cls._state.event(event)
cls._state.update(cls.delta, cls.ticks)
cls._state.draw(cls.surface)
for extension in cls.extension:
extension(cls)
pygame.display.flip()
cls.delta = cls.clock.tick(cls.fps)
@staticmethod
def screen_center():
os.environ['SDL_VIDEO_CENTERED'] = '1'
@staticmethod
def screen_position(x, y):
os.environ['SDL_VIDEO_WINDOW_POS'] = '{0}, {1}'.format(x, y)