def __init__(self): self.screen = pygame.display.get_surface() self.pressed_key = None self.game_over = False self.shadows = pygame.sprite.RenderUpdates() self.sprites = SortedUpdates() self.overlays = pygame.sprite.RenderUpdates() self.use_level(Level())
def use_level(self, level): """Set the level as the current one.""" self.shadows = pygame.sprite.RenderUpdates() self.sprites = SortedUpdates() self.overlays = pygame.sprite.RenderUpdates() self.level = level # Populate the game with the level's objects for pos, tile in level.items.iteritems(): if tile.get("player") in ('true', '1', 'yes', 'on'): sprite = Player(pos) self.player = sprite else: sprite = Sprite(pos, SPRITE_CACHE[tile["sprite"]]) self.sprites.add(sprite) self.shadows.add(Shadow(sprite)) # Render the level map self.background, overlays = self.level.render() # Add the overlays for the level map for (x, y), image in overlays.iteritems(): overlay = pygame.sprite.Sprite(self.overlays) overlay.image = image overlay.rect = image.get_rect().move(x*24, y*16-16)
class Game(object): """The main game object.""" def __init__(self): self.screen = pygame.display.get_surface() self.pressed_key = None self.game_over = False self.shadows = pygame.sprite.RenderUpdates() self.sprites = SortedUpdates() self.overlays = pygame.sprite.RenderUpdates() self.use_level(Level()) def use_level(self, level): """Set the level as the current one.""" self.shadows = pygame.sprite.RenderUpdates() self.sprites = SortedUpdates() self.overlays = pygame.sprite.RenderUpdates() self.level = level # Populate the game with the level's objects for pos, tile in level.items.iteritems(): if tile.get("player") in ('true', '1', 'yes', 'on'): sprite = Player(pos) self.player = sprite else: sprite = Sprite(pos, SPRITE_CACHE[tile["sprite"]]) self.sprites.add(sprite) self.shadows.add(Shadow(sprite)) # Render the level map self.background, overlays = self.level.render() # Add the overlays for the level map for (x, y), image in overlays.iteritems(): overlay = pygame.sprite.Sprite(self.overlays) overlay.image = image overlay.rect = image.get_rect().move(x*24, y*16-16) def control(self): """Handle the controls of the game.""" keys = pygame.key.get_pressed() def pressed(key): """Check if the specified key is pressed.""" return self.pressed_key == key or keys[key] def walk(d): """Start walking in specified direction.""" x, y = self.player.pos self.player.direction = d if not self.level.is_blocking(x+DX[d], y+DY[d]): self.player.animation = self.player.walk_animation() if pressed(pg.K_UP): walk(0) elif pressed(pg.K_DOWN): walk(2) elif pressed(pg.K_LEFT): walk(3) elif pressed(pg.K_RIGHT): walk(1) self.pressed_key = None def main(self): """Run the main loop.""" clock = pygame.time.Clock() # Draw the whole screen initially self.screen.blit(self.background, (0, 0)) self.overlays.draw(self.screen) pygame.display.flip() # The main game loop while not self.game_over: # Don't clear shadows and overlays, only sprites. self.sprites.clear(self.screen, self.background) self.sprites.update() # If the player's animation is finished, check for keypresses if self.player.animation is None: self.control() self.player.update() self.shadows.update() # Don't add shadows to dirty rectangles, as they already fit inside # sprite rectangles. self.shadows.draw(self.screen) dirty = self.sprites.draw(self.screen) # Don't add ovelays to dirty rectangles, only the places where # sprites are need to be updated, and those are already dirty. self.overlays.draw(self.screen) # Update the dirty areas of the screen pygame.display.update(dirty) # Wait for one tick of the game clock clock.tick(15) # Process pygame events for event in pygame.event.get(): if event.type == pg.QUIT: self.game_over = True elif event.type == pg.KEYDOWN: self.pressed_key = event.key