import pygame as pg keybindings = { 'left': pg.K_LEFT, 'right': pg.K_RIGHT, 'down': pg.K_DOWN, 'action': pg.K_s, 'jump': pg.K_UP, } class Control(): def __init__(self, caption): self.screen = pg.display.get_surface() self.done = False self.clock = pg.time.Clock() self.caption = caption self.fps = 60 self.show_fps = False self.current_time = 0.0 self.keys = pg.key.get_pressed() self.state_dict = {} self.state_name = None self.state = None def setup_states(self, state_dict, start_state): self.state_dict = state_dict self.state_name = start_state self.state = self.state_dict[self.state_name] def update(self): self.current_time = pg.time.get_ticks() if self.state.quit: self.done = True elif self.state.done: self.flip_state() self.state.update(self.screen, self.keys, self.current_time) def flip_state(self): previous_state = self.state_name self.state_name = self.state.next self.state = self.state_dict[self.state_name] self.state.previous = previous_state def event_loop(self): for event in pg.event.get(): if event.type == pg.QUIT: self.done = True elif event.type == pg.KEYDOWN: self.keys = pg.key.get_pressed() self.toggle_show_fps(event.key) elif event.type == pg.KEYUP: self.keys = pg.key.get_pressed() self.state.get_event(event) def toggle_show_fps(self, key): if key == pg.K_z: self.show_fps = not self.show_fps if not self.show_fps: pg.display.set_caption(self.caption) def main(self): # game loop for super mario game while not self.done: self.event_loop() self.update() pg.display.update() self.clock.tick(self.fps) if self.show_fps: fps = self.clock.get_fps() fps_string = "{} - {:2f}".format(self.caption, fps) pg.display.set_caption(fps_string) class _State(): def __init__(self): self.start_time = 0.0 self.current_time = 0.0 self.done = False self.quit = False self.next = None self.previous = None self.persist = {} def startup(self, current_time, persistance): self.persist = persistance self.start_time = current_time def cleanup(self): self.done = False return self.persist def update(self, screen, keys, current_time): pass