class Game: def __init__(self, config_filename=None, quit=True, **kwargs): self.config = {} # deprecated! if config_filename: self.parse_config(config_filename) self.screen = Screen() self.frame = Frame(self.screen, config.FRAME) self.tile_factory = TileFactory() self._exit = False self._quit = quit # terminate PyGame when event loop expires def get_tile(self, key): return self.tile_factory.get(key) def get_tile_surface(self, key): return self.tile_factory.get_surface(key) def parse_config(self, config_filename): """ Adds contents of config file to config dictionary. """ warnings.warn('Game.parse_config has been deprecated!') path, fn = os.path.split(config_filename) self.path = path + os.sep before = set(dir()) conf = open(config_filename).read() exec(conf) after = set(dir()) for name in after - before: self.config[name] = eval(name) def event_loop(self, figure_moves=None, exit=True, draw_func=None, keymap=None, delay=20): self.events = EventGenerator() if figure_moves: self.events.add_listener(FigureMoveListener(figure_moves)) if keymap: self.events.add_listener(EventListener(keymap=keymap)) if exit: self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(draw_func, self.events, delay=delay): self.events.event_loop() def exit(self): self.events.exit_signalled() # if self._quit: # pygame.quit() def wait_for_move(self, move=None, draw_func=None, delay=0.01): if type(move) is list: move = MoveGroup(move) while not move.finished: move.move() if draw_func: self.screen.clear() draw_func() move.draw() pygame.display.update() time.sleep(delay)
class Colors: def __init__(self, screen): self.screen = screen self.frame = Frame(self.screen, Rect(20, 20, 800, 700)) self.tile_factory = TileFactory('data/colortiles.conf') self.current_level = 2 self.level_loader = levels self.score = 0 self.level = None self.player = None self.events = None self.ghosts = [] self.update_mode = None self.status_box = None self.image_box = None self.create_level() self.create_player() self.create_ghosts() self.create_status_box() self.collided = False self.mode = None self.update_mode = self.update_ingame def create_level(self): self.otherFrame = Frame(self.screen, Rect(0, 0, 800, 700)) self.image_box = ImageBox(self.otherFrame, "data/background.bmp") self.image_box.draw() tmap = TiledMap(self.frame, self.tile_factory) self.level = ColorsLevel( self.level_loader.getlevel(self.current_level), tmap, self.level_loader.getGhostSpeed(self.current_level)) def draw(self): self.update_mode() self.level.draw() self.player.update() self.player.draw() for g in self.ghosts: g.update() g.draw() self.status_box.draw() pygame.display.update() self.check_collision(self.player.sprite.pos) time.sleep(0.005) def create_player(self): self.player = Player( self.frame, self.tile_factory, self.level_loader.getplayerpos(self.current_level), self.level) self.player.set_direction(DOWN) def run(self): startsound.play() pygame.mixer.music.load("music/shootingstars.ogg") pygame.mixer.music.play(-1) self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.player.move)) self.events.add_listener(FigureMoveListener(self.unstuck_ghosts)) self.events.add_listener(FigureColorListener(self.player.set_color)) self.events.add_listener(ExitListener(self.exit_game)) with draw_timer(self, self.events): self.events.event_loop() def create_ghosts(self): self.ghosts = [] for pos in self.level_loader.getghostpos(self.current_level): self.ghosts.append( Ghost(self.frame, self.tile_factory, pos, self.level)) def unstuck_ghosts(self, pos): for g in self.ghosts: g.unstuck() def check_collision(self, pos): if self.player.collision(self.ghosts): self.update_mode = self.update_die self.player.die() self.collided = True else: field = self.level.at(pos) if field in '123456': time.sleep(1) self.update_mode = self.update_level_complete elif field == 's': self.level.remove_soul(pos) self.score += 100 def update_die(self): """finish movements""" if self.player.sprite.finished: time.sleep(1) self.player.lives = self.player.lives - 1 if self.player.lives == 0: deadsound.play() self.complete_level(1) self.events.exit_signalled() self.player.lives = 4 self.run() else: self.status_box.data['lives'] = self.player.lives self.score -= 50 self.reset_level() self.events.empty_event_queue() self.update_mode = self.update_ingame def update_level_complete(self): """finish movement""" if self.player.sprite.finished: time.sleep(1) self.complete_level(self.current_level) def reset_level(self): self.player.sprite.pos = self.level_loader.getplayerpos( self.current_level) self.create_ghosts() def update_ingame(self): self.check_collision(self.player.sprite.pos) def create_status_box(self): frame = Frame(self.screen, Rect(700, 20, 200, 50)) data = { 'lives': 3, 'level': self.current_level - 1, } self.status_box = DictBox(frame, data) def complete_level(self, current_level): self.current_level = current_level + 1 if self.current_level > 7: pygame.quit() exit() self.frame = Frame(self.screen, Rect(32, 32, 720, 720)) self.tile_factory = TileFactory('data/colortiles.conf') self.level_loader = levels self.level = None self.player = None self.events = None self.ghosts = [] self.update_mode = None self.status_box = None self.create_level() self.create_player() self.create_ghosts() self.create_status_box() self.collided = False self.mode = None self.update_mode = self.update_ingame self.run() def exit_game(self): pygame.quit() exit()