class Animate(pygame.sprite.Sprite): def __init__(self, screen, sprite_sheet, sheet_offsets, pos=(0, 0), resize=None, detail=None, frame_delay=None): super().__init__() self.screen = screen if not resize: resize = (self.screen.get_height() // 10, self.screen.get_height() // 10) self.image_manager = ImageManager(sprite_sheet, sheet=True, pos_offsets=sheet_offsets, resize=resize, animation_delay=frame_delay) self.image, self.rect = self.image_manager.get_image() if detail: self.detail_piece = ImageManager(detail, sheet=True, pos_offsets=sheet_offsets, resize=resize).all_images()[0] self.image.blit(self.detail_piece, (0, 0)) else: self.detail_piece = None self.rect.centerx, self.rect.centery = pos def update(self): self.image = self.image_manager.next_image() if self.detail_piece: self.image.blit(self.detail_piece, (0, 0)) def blit(self): self.screen.blit(self.image, self.rect)
class PacMan(pygame.sprite.Sprite): def __init__(self, screen, maze): super().__init__() self.screen = screen self.maze = maze self.push = 3 self.death = ImageManager('img/Pac.png', sheet=True, pos_offsets=[(0, 32 * 16, 32, 32), (0, 32 * 17, 32, 32), (0, 32*18, 32, 32), (0, 32*19, 32, 32), (0, 32*20, 32, 32), (0, 32*21, 32, 32)], resize=(self.maze.block_size - 4, self.maze.block_size - 4), animation_delay=150, repeat=False) self.up = ImageManager('img/Pac.png', sheet=True, pos_offsets=[(0, 32 * 4, 32, 32), (0, 32 * 5, 32, 32), (0, 32 * 6, 32, 32), (0, 32 * 7, 32, 32)], resize=(self.maze.block_size-4, self.maze.block_size-4)) self.down = ImageManager('img/Pac.png', sheet=True, pos_offsets=[(0, 32 * 12, 32, 32), (0, 32 * 13, 32, 32), (0, 32 * 14, 32, 32), (0, 32 * 15, 32, 32)], resize=(self.maze.block_size-4, self.maze.block_size-4)) self.left = ImageManager('img/Pac.png', sheet=True, pos_offsets=[(0, 32 * 8, 32, 32), (0, 32 * 9, 32, 32), (0, 32 * 10, 32, 32), (0, 32 * 11, 32, 32)], resize=(self.maze.block_size-4, self.maze.block_size-4)) self.right = ImageManager('img/Pac.png', sheet=True, pos_offsets=[(0, 0, 32, 32), (0, 32 * 1, 32, 32), (0, 32 * 2, 32, 32), (0, 32 * 3, 32, 32)], resize=(self.maze.block_size-4, self.maze.block_size-4)) self.spawn_info = self.maze.player_spawn[1] self.tile = self.maze.player_spawn[0] self.direction = None self.moving = False self.image, self.rect = self.right.get_image() self.rect.centerx, self.rect.centery = self.spawn_info # screen coordinates for spawn self.dead = False self.event_map = {pygame.KEYDOWN: self.action, pygame.KEYUP: self.reset_direction} def set_death(self): self.dead = True self.image, _ = self.death.get_image() def revive(self): self.dead = False self.image, _ = self.right.get_image() self.death.image_index = 0 def reset_position(self): self.rect.centerx, self.rect.centery = self.spawn_info # screen coordinates for spawn def reset_direction(self, event): if event.key in (pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT): self.moving = False def action(self, event): if event.key == pygame.K_UP: self.set_move_up() if event.key == pygame.K_DOWN: self.set_move_down() if event.key == pygame.K_LEFT: self.set_move_left() if event.key == pygame.K_RIGHT: self.set_move_right() def set_move_up(self): if self.direction != 'u': self.direction = 'u' self.moving = True def set_move_left(self): if self.direction != 'l': self.direction = 'l' self.moving = True def set_move_down(self): if self.direction != 'd': self.direction = 'd' self.moving = True def set_move_right(self): if self.direction != 'r': self.direction = 'r' self.moving = True def push_back(self): if self.direction == 'l': self.rect.x += self.push elif self.direction == 'r': self.rect.x -= self.push if self.direction == 'u': self.rect.y += self.push elif self.direction == 'd': self.rect.y -= self.push def pos_test(self): test = self.rect if self.direction == 'l': test = self.rect.move((-1, 0)) elif self.direction == 'r': test = self.rect.move((+1, 0)) if self.direction == 'u': self.rect.move((0, -1)) elif self.direction == 'd': self.rect.move((0, +1)) return test def is_blocked(self): while pygame.sprite.spritecollideany(self, self.maze.maze_blocks): self.push_back() def collide(self): score = 0 fruit_count = 0 power = None if pygame.sprite.spritecollideany(self, self.maze.pellets): pygame.sprite.spritecollideany(self, self.maze.pellets).kill() score += 10 elif pygame.sprite.spritecollideany(self, self.maze.fruits): pygame.sprite.spritecollideany(self, self.maze.fruits).kill() score += 20 fruit_count += 1 elif pygame.sprite.spritecollideany(self, self.maze.power_pellets): pygame.sprite.spritecollideany(self, self.maze.power_pellets).kill() score += 20 power = True return score, fruit_count, power def update(self): if not self.dead: self.is_blocked() if self.direction and self.moving: if self.direction == 'u': self.image = self.up.next_image() elif self.direction == 'd': self.image = self.down.next_image() elif self.direction == 'l': self.image = self.left.next_image() elif self.direction == 'r': self.image = self.right.next_image() if not self.is_blocked(): if self.direction == 'u': self.rect.centery -= 1 elif self.direction == 'l': self.rect.centerx -= 1 elif self.direction == 'd': self.rect.centery += 1 elif self.direction == 'r': self.rect.centerx += 1 else: self.image = self.death.next_image() def blit(self): self.screen.blit(self.image, self.rect)
class Ghost(Sprite): def __init__(self, screen, maze, info, file): super().__init__() self.screen = screen self.maze = maze self.kill_able = ImageManager('img/Gos.png', sheet=True, pos_offsets=[(0, 32 * 8, 32, 32), (0, 32 * 9, 32, 32)], resize=(self.maze.block_size, self.maze.block_size), animation_delay=150) self.orange = ImageManager('img/Gos.png', sheet=True, pos_offsets=[(0, 32 * 0, 32, 32), (0, 32 * 1, 32, 32)], resize=(self.maze.block_size, self.maze.block_size), animation_delay=250) self.red = ImageManager('img/Gos.png', sheet=True, pos_offsets=[(0, 32 * 2, 32, 32), (0, 32 * 3, 32, 32)], resize=(self.maze.block_size, self.maze.block_size), animation_delay=250) self.cyan = ImageManager('img/Gos.png', sheet=True, pos_offsets=[(0, 32 * 4, 32, 32), (0, 32 * 5, 32, 32)], resize=(self.maze.block_size, self.maze.block_size), animation_delay=250) self.pink = ImageManager('img/Gos.png', sheet=True, pos_offsets=[(0, 32 * 6, 32, 32), (0, 32 * 7, 32, 32)], resize=(self.maze.block_size, self.maze.block_size), animation_delay=250) self.images = self.red if file == 'orange': self.images = self.orange elif file == 'cyan': self.images = self.cyan elif file == 'pink': self.images = self.pink self.score_font = pygame.font.Font('fonts/Lumberjack-Regular.ttf', 18) self.score_image = None self.image, self.rect = self.images.get_image() self.return_tile = info[0] self.eaten_time = None self.start_pos = info[1] self.reset_position() self.on = False self.kill = False self.ret = False def reset_position(self): self.rect.left, self.rect.top = self.start_pos def set_eaten(self): self.ret = True self.kill = False self.image = self.score_font.render('200', True, Colors().white) def trigger(self): if not self.ret: self.kill = True self.image, _ = self.kill_able.get_image() def enable(self): self.on = True def update_normal(self): self.image = self.images.next_image() def update_blue(self): self.image = self.kill_able.next_image() def update(self): if self.on: if not self.kill: self.update_normal() else: self.update_blue() def blit(self): self.screen.blit(self.image, self.rect)