Exemplo n.º 1
0
class World(object):
    """Class that represents the state of the game world"""

    FPS = 60

    def __init__(self, playerx, playery):
        self.simon = Simon(playerx, playery)
        self.obstacles = self.generate_mask_boxes("assets/levels/backgroundmask.png")
        self.background = pygame.image.load("assets/levels/background.png").convert_alpha()
        self.death = self.generate_mask_boxes("assets/levels/backgrounddeath.png")
        self.death = self.death[0]
        self.goal = pygame.Rect(6960, 190, 75, 75)
        self.enemies = []
        self.all_sprites = []
        self.all_sprites.append(self.simon)
        self.gravity = 3
        self.frame = 0
        self.time_limit = 240
        self.time = self.time_limit
        self.winner = 0

        self.mp_max = 60
        self.mp = self.mp_max
        self.mp_regen = 5

        self.stair_width = 100
        self.stair_height = 40
        self.bot_stairs = [
            (320, 808),
            (94, 582),
            (752, 584),
            (1275, 582),
            (2660, 520),
            (2799, 390),
        ]
        self.top_stairs = [
            (94, 582),
            (235, 440),
            (814, 520),
            (1137, 454),
            (2799, 390),
            (2567, 164),
        ]

    def update(self, inputs):
        """call all world processing routines"""
        if self.frame < self.FPS:
            self.frame += 1
        else:
            self.frame = 0
            self.time -= 1
            if self.mp < self.mp_max:
                self.mp += self.mp_regen

        self.simon.update(inputs, self)

        if self.simon.health == 0:
            self.p2win()
        if self.simon.rect.colliderect(self.death):
            self.p2win()
        if self.time == 0:
            self.p2win()
        if self.simon.rect.colliderect(self.goal):
            self.p1win()

        for i, enemy in enumerate(self.enemies):
            enemy.update(self)
            if self.simon.is_attacking:
                box = self.simon.attack
                if box.colliderect(enemy.rect):
                    self.destroy_actor(i)
            box = self.simon.rect
            if box.colliderect(enemy):
                if box.x < enemy.rect.x:
                    self.simon.receive_hit("Right")
                else:
                    self.simon.receive_hit("Left")

    def generate_mask_boxes(self, imagemask):
        """Returns a list of rectangle objects based on image mask"""
        background_mask = (pygame.image.load(imagemask).convert_alpha())
        level_mask = pygame.mask.from_surface(background_mask)
        level_boxes = level_mask.get_bounding_rects()
        return level_boxes

    def create_enemy(self, xpos, ypos, type="Bat"):
        """create an enemy in the game world"""
        unspawnable_box = self.simon.rect.inflate(300, 300)
        if not unspawnable_box.collidepoint(xpos, ypos):
            if type == "Ghoul" and self.mp >= Ghoul.cost:
                self.mp -= Ghoul.cost
                self.enemies.append(Ghoul(xpos, ypos))
                self.all_sprites.append(self.enemies[-1])
            elif type == "Bat" and self.mp >= Bat.cost:
                self.mp -= Bat.cost
                self.enemies.append(Bat(xpos, ypos))
                self.all_sprites.append(self.enemies[-1])

    def destroy_actor(self, index):
        """removes an enemy in the game world"""
        del self.enemies[index]
        del self.all_sprites[index+1]

    def p1win(self):
        self.winner = 1

    def p2win(self):
        self.winner = 2