Пример #1
0
    def __init__(self, world):
        from vecrec import Vector
        field = world.field

        def random_position():
            return field.center + Vector.random(0.4*field.height)
        def random_velocity():
            return Vector.random(50)

        # Create a few obstacles in the same way.

        self.obstacles = [
                tokens.Obstacle(
                    Vector(
                        random.randrange(field.left + 100, field.center_x),
                        random.randrange(field.bottom + 100, field.top - 100),
                    ),
                    Vector.random(10))
                for i in range(2)
        ]

        # Create a cannon and several targets for each player and decide which 
        # side of the field each cannon should go on.

        self.targets = []
        targets_per_player = 2

        players = world.players
        num_players = len(players)
        self.cannons = []

        for i in range(num_players):
            player = players[i]
            position = Vector(
                    field.left, (i + 1) * field.height / (num_players + 1))
            self.cannons.append(
                    tokens.Cannon(player, position))

            for j in range(targets_per_player):
                x = field.width * 2/3
                y = field.height * (1 + i * targets_per_player + j) / (num_players * targets_per_player + 1)
                target = tokens.Target(
                        Vector(x, y), random_velocity(), player)
                self.targets.append(target)

        # Create the final target

        self.final_target = tokens.Target(
                Vector(field.width * 3/4, field.center_y),
                random_velocity(),
        )
        self.targets.append(self.final_target)
Пример #2
0
    def on_update_game(self, dt):
        if self.token.player is not self.actor.player:
            return

        cannon = self.token
        player = self.token.player
        world = self.token.world

        self.shot_timer -= dt
        if self.shot_timer < 0:
            self.reset_shot_timer()

            # Pick the closest target to aim at.

            def distance_to_cannon(target):
                return cannon.position.get_distance(target.position)

            if self.token.player.targets:
                target = sorted(player.targets, key=distance_to_cannon)[0]
            else:
                target = world.final_target

            # Aim in front of the target with some variance.

            aim = target.position - cannon.position
            aim += 0.0 * target.velocity
            aim += 0.05 * aim.magnitude * Vector.random()
            aim.normalize()

            velocity = cannon.muzzle_speed * aim
            position = cannon.position + 25 * aim
            bullet = tokens.Bullet(cannon, position, velocity)

            # Shoot unless we're out of bullets.

            if player.can_shoot(bullet):
                self.actor >> messages.ShootBullet(bullet)
            else:
                self.shot_timer /= 2
Пример #3
0
 def random_velocity():
     return Vector.random(50)
Пример #4
0
 def random_position():
     return field.center + Vector.random(0.4*field.height)