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)
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
def random_velocity(): return Vector.random(50)
def random_position(): return field.center + Vector.random(0.4*field.height)