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 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 run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.snake.set_direction)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
def run(self): self.mode = self.update_ingame self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.pac.move)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
class Boxes: def __init__(self): self.screen = Screen(Vector(600, 400), 'data/background.png') self.frame = Frame(self.screen, Rect(64, 64, 320, 320)) tile_factory = TileFactory('data/tiles.conf') self.tm = TiledMap(self.frame, tile_factory) self.player = Sprite(self.frame, tile_factory.get('b.tail'), Vector(4, 1), speed=2) self.tm.set_map(BOXMAP) self.draw() self.events = None def draw(self): self.tm.draw() self.player.draw() pygame.display.update() def move(self, direction): nearpos = self.player.pos + direction farpos = nearpos + direction near = self.tm.at(nearpos) far = self.tm.at(farpos) if near == '#': return if near in 'xX' and far in '#xX': return else: # move possible moves = MoveGroup() self.player.add_move(direction) moves.add(self.player) if near in 'xX': # crate moved floor = near=='x' and '.' or '*' insert = far=='*' and 'X' or 'x' moves.add(MapMove(self.tm, nearpos, direction, 1, floor_tile=floor, insert_tile=insert)) wait_for_move(moves, self.screen, self.draw, 0.01) self.tm.cache_map() self.draw() self.check_complete() def check_complete(self): s = self.tm.get_map() if s.count('X') == 4: print("\nCongratulations!\n") time.sleep(2) self.events.exit_signalled() def run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.move)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
class CollectFruit: def __init__(self, screen): self.screen = screen self.frame = Frame(self.screen, Rect(64, 64, 320, 320)) tile_factory = TileFactory('data/tiles.conf') self.tm = TiledMap(self.frame, tile_factory) self.player = Sprite(self.frame, tile_factory.get('b.pac_right'), Vector(4, 1), speed=2) self.tm.set_map(FRUITMAP) self.draw() self.events = None self.score = 0 def draw(self): self.tm.draw() self.player.draw() pygame.display.update() def move(self, direction): nearpos = self.player.pos + direction near = self.tm.at(nearpos) if near == '#': return self.player.add_move(direction) wait_for_move(self.player, self.screen, self.draw, 0.01) self.check_player_square() def check_player_square(self): field = self.tm.at(self.player.pos) if field == '*': time.sleep(1) self.events.exit_signalled() elif field in 'abcdefgh': self.score += 100 self.tm.set_tile(self.player.pos, '.') self.tm.cache_map() self.draw() def run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.move)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
class SnakeGame: def __init__(self, screen): self.screen = screen self.tile_factory = TileFactory('data/tiles.conf') self.level = None self.snake = None self.status_box = None self.events = None self.score = 0 self.create_level() self.create_snake() self.create_status_box() self.update_mode = self.update_ingame self.move_delay = MOVE_DELAY self.delay = MOVE_DELAY def create_snake(self): start_pos = Vector(5, 5) frame = Frame(self.screen, Rect(10, 10, 640, 512)) self.snake = SnakeSprite(frame, self.tile_factory, start_pos, self.level) self.snake.set_direction(RIGHT) def create_level(self): frame = Frame(self.screen, Rect(10, 10, 640, 512)) tmap = TiledMap(frame, self.tile_factory) self.level = SnakeLevel(LEVEL, tmap) self.level.place_random_fruit() def create_status_box(self): frame = Frame(self.screen, Rect(660, 20, 200, 200)) self.status_box = DictBox(frame, {'score':0}) def update_finish_moves(self): """finish movements before Game Over""" if not self.snake.is_moving(): pygame.display.update() time.sleep(1) self.events.exit_signalled() def update_ingame(self): self.delay -= 1 if self.delay <=0: self.delay = self.move_delay self.snake.move_forward() if self.snake.eaten and not self.snake.is_moving(): self.level.remove_fruit(self.snake.head.pos) self.level.place_random_fruit() self.status_box.data['score'] += 100 self.snake.eaten = None if self.snake.crashed: self.update_mode = self.update_finish_moves self.score = self.status_box.data['score'] def update(self): self.update_mode() self.snake.move() def draw(self): self.update() self.level.draw() self.snake.draw() self.status_box.draw() pygame.display.update() def run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.snake.set_direction)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
def run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.spaceship.set_direction)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
class SpaceRaceGame: def __init__(self, screen): self.screen = screen self.tile_factory = TileFactory() self.starscape = None self.level = None self.spaceship = None self.status_box = None self.events = None self.score = 0 self.create_starscape() self.create_level() self.create_status_box() self.update_mode = self.update_ingame self.move_delay = MOVE_DELAY self.delay = MOVE_DELAY def create_starscape(self): frame = Frame(self.screen, Rect(0, 0, 800, 600)) self.starscape = StarScape(frame) def create_level(self): frame = Frame(self.screen, Rect(10, 10, 640, 512)) self.level = SpaceshipLevel(frame, self.tile_factory) self.spaceship = SpaceshipSprite(frame, self.tile_factory, Vector(1, 1), self.level) def create_status_box(self): frame = Frame(self.screen, Rect(660, 20, 200, 50)) self.status_box = DictBox(frame, {'score': 0}) def update_finish_moves(self): """finish movements before Game Over""" if not self.spaceship.is_moving(): pygame.display.update() time.sleep(1) self.events.exit_signalled() def update_ingame(self): self.delay -= 1 if self.delay <= 0: self.delay = self.move_delay self.spaceship.move_forward() if self.spaceship.crashed: self.update_mode = self.update_finish_moves self.score = 0 if self.spaceship.finished: self.update_mode = self.update_finish_moves self.score = 1000 def draw(self): self.update_mode() self.screen.clear() self.starscape.draw() self.level.draw() self.spaceship.draw() self.status_box.draw() pygame.display.update() self.starscape.scroll() def run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.spaceship.set_direction)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
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)
def run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.frutris_box.store_command)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
class FrutrisGame: def __init__(self, screen): self.level_counter = 1 play_effect('frutris') self.screen = screen screen.clear() self.frame = Frame(self.screen, Rect(10, 10, 640, 512)) self.tile_factory = TileFactory('data/tiles.conf') self.events = None self.frutris_box = FrutrisBox(self.frame, self.tile_factory, LEVEL) # frame = Frame(self.screen, Rect(660, 220, 200, 200)) self.data = { 'score': 0, 'level': 1, } self.status_box = self.create_status_box() # Music self.music_counter = 50 # periodically check for expiring track self.current_music = ('a', 1) self.music = MusicPlayer() self.music.play_music('/home/krother/projects/frutris/frutris/music/a1.ogg') def choose_next_music(self): MUSIC = '/home/krother/projects/frutris/frutris/music/{}{}.ogg' LETTERS = 'aaaabbbbcccccccc' letter, number = self.current_music number = 3 - number stack_size = self.frutris_box.level.get_stack_size() letter = LETTERS[stack_size] #if len(self.players) >= 1: # stack_size = self.players[0].get_stack_size() self.current_music = (letter, number) next_track = MUSIC.format(letter, number) print('NEXT TRACK: ', next_track) return next_track def update_music(self): self.music_counter -= 1 if self.music_counter == 0: self.music_counter = 50 if self.music.check_music_status() == CLOSE_TO_END: next_track = self.choose_next_music() self.music.next_music(next_track) @property def score(self): return self.data['score'] def create_status_box(self): frame = Frame(self.screen, Rect(660, 20, 200, 200)) return DictBox(frame, self.data) def draw(self): self.data['score'] += self.frutris_box.counter.pull_score() self.frutris_box.draw() self.status_box.draw() if self.frutris_box.game_over: self.events.exit_signalled() self.update_music() def run(self): self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.frutris_box.store_command)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()
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()
class PacGame: def __init__(self, screen): self.screen = screen self.frame = Frame(self.screen, Rect(10, 10, 640, 512)) self.tile_factory = TileFactory('data/tiles.conf') self.level = None self.pac = None self.ghosts = [] self.status_box = None self.events = None self.create_level() self.create_pac() self.create_ghosts() self.create_status_box() frame = Frame(self.screen, Rect(660, 220, 200, 200)) self.lives = BarDisplay(frame, self.tile_factory, 3, 'p') self.collided = False self.mode = None self.update_mode = self.update_ingame def create_level(self): tmap = TiledMap(self.frame, self.tile_factory) self.level = PacLevel(LEVEL, tmap) def create_pac(self): start_pos = Vector(5, 5) self.pac = Pac(self.frame, self.tile_factory, PAC_START, self.level) self.pac.set_direction(RIGHT) def create_ghosts(self): self.ghosts = [] for pos in GHOST_POSITIONS: self.ghosts.append(Ghost(self.frame, self.tile_factory, pos, self.level)) def reset_level(self): self.pac.sprite.pos = PAC_START self.create_ghosts() def create_status_box(self): frame = Frame(self.screen, Rect(660, 20, 200, 200)) data = { 'score': 0, 'level':1, } self.status_box = DictBox(frame, data) def check_collision(self): if self.pac.collision(self.ghosts): self.update_mode = self.update_die self.pac.die() self.collided = True def update_die(self): """finish movements""" if self.pac.sprite.finished: time.sleep(1) self.lives.decrease() if self.lives.value == 0: self.events.exit_signalled() else: self.reset_level() self.events.empty_event_queue() self.update_mode = self.update_ingame def update_level_complete(self): """finish movement""" if self.pac.sprite.finished: time.sleep(1) self.events.exit_signalled() def update_ingame(self): self.check_collision() if self.pac.eaten: self.status_box.data['score'] = self.pac.score self.pac.eaten = None self.score = self.pac.score if self.level.dots_left == 0: self.update_mode = self.update_level_complete def draw(self): self.update_mode() self.level.draw() self.pac.update() self.pac.draw() for g in self.ghosts: g.update() g.draw() self.status_box.draw() pygame.display.update() self.check_collision() time.sleep(0.005) def run(self): self.mode = self.update_ingame self.events = EventGenerator() self.events.add_listener(FigureMoveListener(self.pac.move)) self.events.add_listener(ExitListener(self.events.exit_signalled)) with draw_timer(self, self.events): self.events.event_loop()