Ejemplo n.º 1
0
    def update(self, dt):
        player_pos = self.scene.player_controller.player.position

        for enemy in self.enemies:
            # handle enemy stagger time and stagger recovery
            if enemy.stagger_time_left > 0:
                enemy.stagger_time_left -= dt
                if enemy.stagger_time_left <= 0:
                    enemy.recover_from_stagger()

            # handle enemy movement
            if enemy.movement_mode == EnemyMovementMode.MoveToWaypoint:
                # rotate towards the current waypoint:
                enemy.rotation_degrees = (enemy.current_waypoint -
                                          enemy.position).to_angle_degrees()
                # # if we're less than 10 units from the waypoint, we randomize a new one!
                if (enemy.current_waypoint - enemy.position).length() <= 10:
                    enemy.randomize_new_waypoint()
            elif enemy.movement_mode == EnemyMovementMode.MoveToPlayer:
                # rotate towards the player:
                enemy.rotation_degrees = (player_pos -
                                          enemy.position).to_angle_degrees()
            else:
                raise Exception('Unknown enemy movement mode: {}'.format(
                    enemy.movement_mode))

            # if enemy velocity is lower than max velocity, then increment velocity. Otherwise do nothing - the enemy
            # will be a freely moving object until the damping slows it down below max speed
            if enemy.velocity.length() < enemy.max_velocity:
                # increment the velocity
                enemy.velocity += Vector.from_angle_degrees(enemy.rotation_degrees).normalize() * \
                                  (enemy.acceleration_per_second * dt / 1000)
Ejemplo n.º 2
0
 def spawn(self):
     angles = list(range(0, 360, 10))
     for angle in angles:
         self.space.add_child(
             TtlNode(mass=1e10,
                     sprite=self.box_image,
                     angular_velocity=1,
                     ttl=random.randrange(3000, 6000),
                     shape=Polygon.from_box(Vector(20, 20)),
                     velocity=Vector.from_angle_degrees(angle) * 50))
Ejemplo n.º 3
0
    def shoot_bullet(self):
        bullet_position = self.get_initial_bullet_position()
        bullet_velocity = Vector.from_angle_degrees(
            self.parent.rotation_degrees) * settings.GRENADE_LAUNCHER_BULLET_SPEED
        self.scene.space.add_child(GrenadeLauncherBullet(position=bullet_position, velocity=bullet_velocity))
        # reset cooldown time
        self.cooldown_time_remaining = self.get_cooldown_time()

        # play shooting sound
        registry.global_controllers.assets_controller.grenade_launcher_shot_sound.play()
Ejemplo n.º 4
0
 def shoot_bullet(self):
     bullet_position = self.get_initial_bullet_position()
     bullet_velocity = Vector.from_angle_degrees(
         self.parent.rotation_degrees) * settings.FORCE_GUN_BULLET_SPEED
     self.scene.space.add_child(
         ForceGunBullet(position=bullet_position, velocity=bullet_velocity))
     # reset cooldown time
     self.cooldown_time_remaining = self.get_cooldown_time()
     # play shooting sound
     registry.global_controllers.assets_controller.force_gun_shot_sound.play(
     )
Ejemplo n.º 5
0
Archivo: main.py Proyecto: labuzm/kaa
    def __init__(self):
        self.camera.position = Vector(0., 0.)
        self.space = self.root.add_child(
            SpaceNode(position=Vector(0, 0),
                      gravity=Vector(0, 20),
                      damping=0.9))
        image = Sprite(PYTHON_IMAGE_PATH)

        random_angle = random.randrange(225, 315)
        self.node = self.space.add_child(
            BodyNode(mass=100,
                     sprite=image,
                     angular_velocity=10,
                     shape=Polygon.from_box(Vector(20, 20)),
                     velocity=Vector.from_angle_degrees(random_angle) * 100))

        self.node.set_position_update_callback(update_position)
        self.node.set_velocity_update_callback(update_velocity)
Ejemplo n.º 6
0
def test_vector():
    v1 = Vector.xy(1.)
    assert v1.x == 1. and v1.y == 1.
    v2 = Vector(2., 2.)
    assert v2.x == 2. and v2.y == 2.
    assert v1 == Vector(1., 1.)
    assert v2 == Vector(2., 2.)

    zero = Vector(0, 0)
    assert not zero
    assert zero.is_zero()

    assert v1 + v2 == Vector.xy(3)
    assert Vector.xy(3.) - v2 == v1
    assert v1 * 10 == Vector.xy(10.)
    assert Vector.xy(10.) / 10 == v1
    assert -v1 == Vector.xy(-1.)

    rotated_vector = Vector(1, 0).rotate_angle_degrees(90)
    assert pytest.approx(rotated_vector.x) == 0
    assert pytest.approx(rotated_vector.y) == 1.

    v = Vector.from_angle_degrees(90)
    assert pytest.approx(rotated_vector.x) == 0
    assert pytest.approx(rotated_vector.y) == 1.
    assert v.to_angle_degrees() == 90
    assert Vector(1., 0).angle_between_degrees(Vector(0, 1.)) == 90

    assert Vector(1., 0).normalize().dot(Vector(1, 1.).normalize()) > 0
    assert Vector(1., 0).normalize().dot(Vector(0, 1.).normalize()) == 0
    assert Vector(1., 0).normalize().dot(Vector(-1, 1.).normalize()) < 0

    assert Vector(0, 0).distance(Vector(10., 0)) == 10.

    v = Vector(10., 10.)
    assert v.normalize() == v / v.length()
    assert v.length() == math.sqrt(v.x**2 + v.y**2)
Ejemplo n.º 7
0
Archivo: main.py Proyecto: ylwb/kaa
    fmt_print("bool({})\n --> {}", v1, bool(v1))
    fmt_print("{} == {}\n --> {}", v1, v2, v1 == v2)
    fmt_print("{} == {}\n --> {}", v1, v1, v1 == v1)
    fmt_print("{} + {}\n --> {}", v1, v2, v1 + v2)
    fmt_print("{} - {}\n --> {}", v1, v2, v1 - v2)
    fmt_print("{} * {}\n --> {}", v1, m, v1 * m)
    fmt_print("{} / {}\n --> {}", v1, m, v1 / m)
    fmt_print("{} dot {}\n --> {}", v1, v2, v1.dot(v2))
    fmt_print("{} distance to {}\n --> {}", v1, v2, v1.distance(v2))
    fmt_print("negative {}\n --> {}", v1, -v1)
    fmt_print("normalized {}\n --> {}", v1, v1.normalize())
    fmt_print("length of {}\n --> {}", v1, v1.length())
    fmt_print("{} rotated by {} degrees\n --> {}", v1, a_deg,
              v1.rotate_angle_degrees(a_deg))
    fmt_print("vector from angle (degrees) {}\n --> {}", a_deg,
              Vector.from_angle_degrees(a_deg))
    fmt_print("vector {} to angle (degrees)\n --> {}", v1,
              v1.to_angle_degrees())
    fmt_print("vector {} to angle (degrees)\n --> {}", v2,
              v2.to_angle_degrees())
    fmt_print("vector {} to angle (degrees)\n --> {}", v_up,
              v_up.to_angle_degrees())
    fmt_print("vector {} to angle (degrees)\n --> {}", v_down,
              v_down.to_angle_degrees())

    points = [Vector(0., 0.), Vector(1., 0.), Vector(0., 1.)]
    rev_points = list(reversed(points))
    points_invalid = [
        Vector(0., 0.),
        Vector(1., 1.),
        Vector(1., -1.),
Ejemplo n.º 8
0
 def get_initial_bullet_position(self):
     player_pos = self.parent.position
     player_rotation = self.parent.rotation_degrees
     weapon_length = 50  # the bullet won't originate in the center of the player position but 50 pixels from it
     result = player_pos + Vector.from_angle_degrees(player_rotation).normalize() * weapon_length
     return result