Ejemplo n.º 1
0
 def __init__(self, *args, **kwargs):
     super().__init__(
         sprite=registry.global_controllers.assets_controller.
         machine_gun_bullet_img,
         z_index=30,
         body_type=BodyNodeType.
         kinematic,  # MG bullets are kinematic bodies
         lifetime=
         3000,  # will be removed from the scene automatically after 3 secs
         *args,
         **kwargs)
     self.add_child(
         HitboxNode(
             shape=Polygon([
                 Vector(-13, -4),
                 Vector(13, -4),
                 Vector(13, 4),
                 Vector(-13, 4),
                 Vector(-13, -4)
             ]),
             mask=HitboxMask.
             bullet,  # tell physics engine about object type
             collision_mask=HitboxMask.
             enemy,  # tell physics engine which objects it can collide with
             trigger_id=settings.COLLISION_TRIGGER_MG_BULLET
             # ID to be used in custom collision handling function
         ))
Ejemplo n.º 2
0
 def __init__(self):
     self.camera.position = Vector(0., 0.)
     self.space = self.root.add_child(SpaceNode(position=Vector(0, 0)))
     self.box_image = Sprite(PYTHON_IMAGE_PATH)
     self.timer = Timer(200, self.spawn, single_shot=False)
     self.timer.start()
     self.spawn()
Ejemplo n.º 3
0
    def __init__(self, position, hp=100, *args, **kwargs):
        # node's properties
        super().__init__(body_type=BodyNodeType.dynamic, mass=1,
                         z_index=10, position=position,
                         transition=NodeSpriteTransition(registry.global_controllers.assets_controller.enemy_frames,
                                                         duration=max(200, random.gauss(400, 100)), loops=0),
                         *args, **kwargs)
        # create a hitbox and add it as a child node to the Enemy
        self.add_child(HitboxNode(
            shape=Polygon([Vector(-8, -19), Vector(8, -19), Vector(8, 19), Vector(-8, 19), Vector(-8, -19)]),
            mask=HitboxMask.enemy,
            collision_mask=HitboxMask.all,
            trigger_id=settings.COLLISION_TRIGGER_ENEMY,
        ))
        # custom properties
        self.hp = hp
        self.stagger_time_left = 0

        # 75% enemies will move towards player and 25% will move randomly
        if random.randint(0, 100) < 75:
            self.movement_mode = EnemyMovementMode.MoveToPlayer
        else:
            self.movement_mode = EnemyMovementMode.MoveToWaypoint
        self.current_waypoint = None  # for those which move to a waypoint, we'll keep its corrdinates here
        self.randomize_new_waypoint()  # and randomize new waypoint

        self.acceleration_per_second = 300  # how fast will enemy accelerate
        self.max_velocity = random.randint(75, 125)  # we'll make enemy stop accelerating if velocity is above this value
Ejemplo n.º 4
0
    def __init__(self, **kwargs):
        self.is_moving = False
        self.is_frozen = False
        self.current_lane = 2
        self.soap_fuel = self.soap_fuel_max = 30000

        super().__init__(
            body_type=BodyNodeType.kinematic,
            position=LANE_HERO_SLOTS[self.current_lane],
            scale=Vector.xy(0.7),
            **kwargs,
        )

        self.hitbox = self.add_child(
            HitboxNode(
                trigger_id=CollisionTrigger.soap,
                shape=Polygon.from_box(Vector(138, 330)),
                # color=Color(1., 0., 0., 0.5),
                z_index=100,
            ))

        self.transitions_manager.set(
            'animation',
            NodeSpriteTransition(self.SPRITE_FRAMES,
                                 loops=0,
                                 duration=len(self.SPRITE_FRAMES) *
                                 self.FRAME_DURATION),
        )
Ejemplo n.º 5
0
Archivo: main.py Proyecto: labuzm/kaa
    def update(self, dt):
        for event in self.input.events():
            if event.keyboard_key and event.keyboard_key.is_key_down:
                key = event.keyboard_key.key
                if key == Keycode.q:
                    self.engine.quit()
                elif key == Keycode.x:
                    self.pointer.shape = next(self.pointer_shapes_gen)
            elif event.mouse_motion:
                self.pointer.position = event.mouse_motion.position
            elif (
                event.mouse_button and event.mouse_button.button == MouseButton.left
            ):
                if event.mouse_button.is_button_down:
                    self.pointer.color = POINTER_COLOR_ACTIVE
                    self._perform_shape_query()
                else:
                    self.pointer.color = POINTER_COLOR_NORMAL
            elif (
                event.mouse_button
                and event.mouse_button.button == MouseButton.right
                and event.mouse_button.is_button_down
            ):
                self._perform_point_query()

        self._perform_ray_query(
            Vector(0, 250), Vector(300, 250),
        )

        print("Visible nodes: ",
              len(self.spatial_index.query_bounding_box(
                  BoundingBox(0, 0, 300, 300),
              )))
Ejemplo n.º 6
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.º 7
0
 def update_camera(self):
     if self.camera_shake_ticks:
         if self.camera_shake_ticks > 1:
             self.camera.position = Vector(
                 random.uniform(-10, 10),
                 random.uniform(-10, 10),
             )
         else:
             self.camera.position = Vector(0, 0)
         self.camera_shake_ticks -= 1
Ejemplo n.º 8
0
    def __init__(self):
        logger.info("Initializing scene: demo/basic.")
        self.camera.position = Vector(0., 0.)
        self.seg_node = Node()
        self.seg_node.shape = Segment(Vector(-2., -2.),
                                      Vector(2., 2.,))

        self.circle_node = Node()
        self.circle_node.shape = Circle(2., Vector(2., 2.))

        self.box_node = Node()
        self.box_node.shape = Polygon.from_box(Vector(1.5, 1.5))

        logger.info("Node scene before adding to tree: %s", self.seg_node.scene)
        self.root.add_child(self.seg_node)
        self.root.add_child(self.circle_node)
        self.root.add_child(self.box_node)
        logger.info("Node scene after adding to tree: %s", self.seg_node.scene)

        self.virtual_resolutions_cycle = itertools.cycle(
            [Vector(10, 10), Vector(20, 20), Vector(5, 15), Vector(15, 5)]
        )
        self.virtual_resolution_modes_cycle = itertools.cycle(
            [VirtualResolutionMode.aggresive_stretch,
             VirtualResolutionMode.no_stretch,
             VirtualResolutionMode.adaptive_stretch]
        )

        logger.info("Displays info:")
        for display in self.engine.get_displays():
            logger.info("* %r", display)
Ejemplo n.º 9
0
Archivo: main.py Proyecto: ylwb/kaa
 def update(self, dt):
     for event in self.input.events():
         if event.keyboard_key and event.keyboard_key.is_key_down:
             if event.keyboard_key.key == Keycode.q:
                 self.engine.quit()
             elif event.keyboard_key.key == Keycode.w:
                 self.camera.position += Vector(0, -20)
                 self.viewport.position += Vector(0, -20)
             elif event.keyboard_key.key == Keycode.s:
                 self.camera.position += Vector(0, 20)
                 self.viewport.position += Vector(0, 20)
Ejemplo n.º 10
0
 def __init__(self):
     super().__init__()
     self.root.add_child(Node(sprite=registry.global_controllers.assets_controller.title_screen_background_img,
                              z_index=0, position=Vector(0, 0), origin_alignment=Alignment.top_left))
     self.root.add_child(TextNode(font=registry.global_controllers.assets_controller.font_2, font_size=30,
                                  position=Vector(settings.VIEWPORT_WIDTH / 2, 500), text="Click to start the game",
                                  z_index=1, origin_alignment=Alignment.center))
     self.exit_label = TextNode(font=registry.global_controllers.assets_controller.font_2, font_size=30,
                                position=Vector(settings.VIEWPORT_WIDTH / 2, 550), text="Press ESC to exit",
                                z_index=1, origin_alignment=Alignment.center)
     self.root.add_child(self.exit_label)
     self.transitions_fun_stuff()
Ejemplo n.º 11
0
 def __init__(self):
     program = Program.from_files(
         'demos/assets/shaders/vs_default.sc',
         'demos/assets/shaders/fs_default.sc',
     )
     uniforms = {'u_blur': Uniform(UniformType.vec4)}
     self.blur_quality = 20.
     self.material = Material(program, uniforms)
     self.material.set_uniform_value('u_blur', (self.blur_quality, 0, 0, 0))
     self.node = self.root.add_child(
         Node(sprite=Sprite(PYTHON_IMAGE_PATH),
              position=Vector(400, 300),
              scale=Vector.xy(2),
              material=self.material))
Ejemplo n.º 12
0
 def __init__(self, position, hp=100):
     # node's properties
     super().__init__(body_type=BodyNodeType.dynamic, mass=1,
                      z_index=10, sprite=registry.global_controllers.assets_controller.player_img, position=position)
     # create a hitbox and add it as a child node to the Player
     self.add_child(HitboxNode(
         shape=Polygon([Vector(-10, -25), Vector(10, -25), Vector(10, 25), Vector(-10, 25), Vector(-10, -25)]),
         mask=HitboxMask.player,
         collision_mask=HitboxMask.enemy,
         trigger_id=settings.COLLISION_TRIGGER_PLAYER
     ))
     # custom properties
     self.hp = hp
     self.current_weapon = None
     self.change_weapon(WeaponType.MachineGun)
Ejemplo n.º 13
0
    def __init__(self):
        super().__init__()
        self.frag_count = 0
        self.root.add_child(
            TextNode(
                font=registry.global_controllers.assets_controller.font_1,
                origin_alignment=Alignment.left,
                position=Vector(10, 20),
                font_size=40,
                z_index=1,
                text="WASD to move, mouse to rotate, left mouse button to shoot"
            ))
        self.root.add_child(
            TextNode(font=registry.global_controllers.assets_controller.font_1,
                     origin_alignment=Alignment.left,
                     position=Vector(10, 45),
                     font_size=40,
                     z_index=1,
                     text="1, 2, 3 - change weapons. SPACE - spawn enemy"))
        self.root.add_child(
            TextNode(font=registry.global_controllers.assets_controller.font_2,
                     origin_alignment=Alignment.right,
                     position=Vector(1910, 20),
                     font_size=30,
                     z_index=1,
                     color=Color(1, 0, 0, 1),
                     text="Press Q to quit game"))
        self.frag_count_label = TextNode(
            font=registry.global_controllers.assets_controller.font_1,
            origin_alignment=Alignment.left,
            position=Vector(10, 70),
            font_size=40,
            z_index=1,
            color=Color(1, 1, 0, 1),
            text="")
        self.root.add_child(self.frag_count_label)

        self.space = SpaceNode(damping=0.3)
        self.root.add_child(self.space)
        self.player_controller = PlayerController(self)
        self.enemies_controller = EnemiesController(self)
        self.collisions_controller = CollisionsController(self)
        self.root.add_child(
            Node(sprite=registry.global_controllers.assets_controller.
                 background_img,
                 position=Vector(settings.VIEWPORT_WIDTH / 2,
                                 settings.VIEWPORT_HEIGHT / 2),
                 z_index=0))
Ejemplo n.º 14
0
    def update(self, dt):
        for event in self.input.events():
            if event.keyboard_key and event.keyboard_key.is_key_down:
                if event.keyboard_key.key == Keycode.c:
                    self.collisions_enabled = not self.collisions_enabled
                    if not self.collisions_enabled:
                        self.obj1_hitbox.collision_mask = HitboxMask.side
                        self.obj2_hitbox.collision_mask = HitboxMask.side
                        print("Objects will NOT collide")
                    else:
                        self.obj1_hitbox.collision_mask = HitboxMask.all
                        self.obj2_hitbox.collision_mask = HitboxMask.all
                        print("Objects will collide")
                if event.keyboard_key.key == Keycode.f:
                    self.engine.window.fullscreen = not self.engine.window.fullscreen
                if event.keyboard_key.key == Keycode.l:
                    self.engine.window.size = self.engine.window.size + Vector(
                        20, 20)
                if event.keyboard_key.key == Keycode.v:
                    self.engine.window.center()

        if self.input.keyboard.is_pressed(Keycode.q):
            print("q Pressed - Exiting")
            self.engine.quit()
        elif self.input.keyboard.is_pressed(Keycode.x) and self.space:
            self.space.delete()
            self.space = None
Ejemplo n.º 15
0
    def __init__(self, *, speed_mod, faded=False, **kwargs):
        assert self.SPRITE_FRAMES
        assert self.TRIGGER_ID

        super().__init__(
            body_type=BodyNodeType.kinematic,
            position=random.choice(LANE_ENEMY_SLOTS),
            velocity=Vector(0, random.uniform(300, 300 + speed_mod)),
            angular_velocity_degrees=random.uniform(-20, 20),
            **kwargs,
        )
        self._is_destroying = False

        self.hitbox = self.add_child(
            HitboxNode(
                trigger_id=self.TRIGGER_ID,
                shape=Circle(48.),
                # color=Color(1., 0., 0., 0.5),
                z_index=100,
            ))

        self.transitions_manager.set(
            'animation',
            NodeSpriteTransition(self.SPRITE_FRAMES,
                                 loops=0,
                                 duration=len(self.SPRITE_FRAMES) *
                                 self.FRAME_DURATION),
        )

        if faded:
            self.color = Color(0.5, 0.5, 0.5, 1.)
Ejemplo n.º 16
0
Archivo: main.py Proyecto: labuzm/kaa
def update_position(node, dt):
    # reimplements default position function
    node.position += (node.velocity + node._velocity_bias) * dt
    node.rotation += (node.angular_velocity + node._angular_velocity_bias) * dt

    node._velocity_bias = Vector.xy(0)
    node._angular_velocity_bias = 0
Ejemplo n.º 17
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.º 18
0
 def stagger(self):
     # use the "stagger" sprite
     self.sprite = registry.global_controllers.assets_controller.enemy_stagger_img
     # stagger stops enemy from moving:
     self.velocity = Vector(0, 0)
     # track time for staying in the staggered state
     self.stagger_time_left = 150
Ejemplo n.º 19
0
Archivo: main.py Proyecto: labuzm/kaa
    def __init__(self):
        self.space = self.root.add_child(SpaceNode(
            gravity=Vector(0., 15.),
            sleeping_threshold=1.,
        ))

        self.pointer_shapes_gen = itertools.cycle(POINTER_SHAPES)
        self.pointer = self.root.add_child(Node(
            position=Vector(-500, -500),  # start offscreen
            shape=next(self.pointer_shapes_gen),
            color=POINTER_COLOR_NORMAL,
            z_index=10,
        ))

        self.spawn_timer = Timer(self._spawn_heartbeat)
        self.spawn_timer.start(0.02, self)
Ejemplo n.º 20
0
    def update(self, dt):
        for event in self.input.events():
            if event.keyboard_key and event.keyboard_key.is_key_down:
                if event.keyboard_key.key == Keycode.n:
                    self.spawn_object()
                elif event.keyboard_key.key == Keycode.r:
                    self.random_collisions = not self.random_collisions
                    print("Random collisions: {}".format(self.random_collisions))
                elif event.keyboard_key.key == Keycode.c:
                    self.collision_spawning = not self.collision_spawning
                    if self.collision_spawning:
                        print("Collision spawning enabled (for one collision)")
                elif event.keyboard_key.key == Keycode.s:
                    self.observed_ball.velocity *= 1.5
                elif event.keyboard_key.key == Keycode.t:
                    print(self.observed_ball.transformation)
                    print(self.observed_ball.transformation.decompose())
                    self.observed_ball.transformation = \
                        (
                            Transformation(scale=Vector(2., 2.))
                            | Transformation(translate=Vector(100., 100.))
                        )
                elif event.keyboard_key.key == Keycode.l:
                    all_balls = [
                        n for n in self.space.children if isinstance(n, FlyingBall)
                    ]
                    if all_balls:
                        target_ball = random.choice(all_balls)
                        target_ball.lifetime = 1500

            if (
                event.mouse_button
                and event.mouse_button.is_button_down
                and event.mouse_button.button == MouseButton.left
            ):
                self.spawn_object(
                    position=self.camera.unproject_position(
                        event.mouse_button.position,
                    ),
                    velocity=Vector(0., 0.),
                )

        if self.input.keyboard.is_pressed(Keycode.q):
            print("q Pressed - Exiting")
            self.engine.quit()

        self.camera.position = self.observed_ball.position
Ejemplo n.º 21
0
 def __init__(self, slot_index, font, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.font = font
     self.slot_index = slot_index
     self.status_label = TextNode(
         font=self.font,
         font_size=16,
         origin_alignment=Alignment.top_left,
         position=Vector(0, 0),
         text=
         f"Controller #{slot_index} not connected. Please connect a controller."
     )
     self.add_child(self.status_label)
     self.controller_stats_container = ControllerStatsContainer(
         slot_index, font, None, position=Vector(0, 20))
     self.add_child(self.controller_stats_container)
     self.controller_stats_container.visible = False
Ejemplo n.º 22
0
Archivo: main.py Proyecto: labuzm/kaa
    def __init__(self):
        self.camera.position = Vector(0., 0.)
        self.my_font = Font(os.path.join('demos', 'assets', 'fonts', 'DejaVuSans.ttf'))

        self.text_node = TextNode(font=self.my_font, content="Hello World", font_size=1.)
        self.root.add_child(self.text_node)
        self.text_buffer = []
        self.input.register_callback(Event.keyboard_key, handle_quit)
Ejemplo n.º 23
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.º 24
0
    def spawn_object(self, position=None, velocity=None):
        if position is None:
            position = Vector(random.randint(-100, 100), random.randint(-100, 100))
        if velocity is None:
            velocity = Vector(random.gauss(0, 0.1), random.gauss(0, 0.1) * 100) * 10.

        obj = self.space.add_child(FlyingBall(
            sprite=self.python_img,
            body_type=BodyNodeType.dynamic,
            position=position,
            velocity=velocity,
            angular_velocity_degrees=random.gauss(0., 50.),
        ))
        obj.add_child(HitboxNode(
            shape=Circle(10.),
            trigger_id=COLLISION_TRIGGER,
        ))
        self.objects.append(obj)
Ejemplo n.º 25
0
Archivo: main.py Proyecto: labuzm/kaa
 def _spawn_heartbeat(self, context):
     if random.random() > 0.8:
         initial_position = Vector(
             random.uniform(0, 300), -20.
         )
         self.space.add_child(
             FallingPiece(initial_position)
         )
     return context.interval
Ejemplo n.º 26
0
 def __init__(self, *, root_node, camera):
     self.camera = camera
     self.flasher = root_node.add_child(
         Node(
             shape=Polygon.from_box(Vector(1400, 800)),
             color=Color(0., 0., 0., 0.),
             z_index=100,
         ))
     self.camera_shake_ticks = 0
Ejemplo n.º 27
0
    def __init__(self):
        self.camera.position = Vector(0., 0.)
        self.python_img = Sprite(PYTHON_IMAGE_PATH)

        self.obj = self.root.add_child(Node(
            position=Vector(-50, 0),
            shape=Circle(10.),
            color=random_color(),
        ))

        self.obj.transitions_manager.set(
            'movement',
            NodeTransition(
                Node.position, Vector(100, 30), 3.,
                advance_method=AttributeTransitionMethod.add,
                loops=0, back_and_forth=True,
            )
        )
Ejemplo n.º 28
0
Archivo: main.py Proyecto: chmod555/kaa
    def __init__(self):
        self.camera.position = Vector(0., 0.)
        self.my_font = Font(
            "kaacore/demos/assets/fonts/Roboto/Roboto-Regular.ttf")

        self.text_node = TextNode(font=self.my_font,
                                  content="Hello World",
                                  font_size=1.)
        self.root.add_child(self.text_node)
Ejemplo n.º 29
0
 def update_count(self, new_count: int):
     if new_count < self.current_count:
         for powerup in self.single_powerups[new_count:self.current_count]:
             powerup.transition = NodeTransitionsParallel([
                 NodeTransition(Node.scale, Vector(0., 0.), duration=400),
                 NodeTransition(Node.color,
                                Color(1., 1., 1., 0.),
                                duration=400),
             ])
     elif new_count > self.current_count:
         for powerup in self.single_powerups[self.current_count:new_count]:
             powerup.transition = NodeTransitionsParallel([
                 NodeTransition(Node.scale, Vector(1., 1.), duration=400),
                 NodeTransition(Node.color,
                                Color(1., 1., 1., 1.),
                                duration=400),
             ])
     self.current_count = new_count
Ejemplo n.º 30
0
 def __init__(self, scene):
     self.scene = scene
     self.enemies = []
     # add some initial enemies
     self.add_enemy(
         Enemy(position=Vector(200, 200),
               rotation_degrees=random.randint(0, 360)))
     self.add_enemy(
         Enemy(position=Vector(1500, 600),
               rotation_degrees=random.randint(0, 360)))
     self.add_enemy(
         Enemy(position=Vector(1000, 400),
               rotation_degrees=random.randint(0, 360)))
     self.add_enemy(
         Enemy(position=Vector(1075, 420),
               rotation_degrees=random.randint(0, 360)))
     self.add_enemy(
         Enemy(position=Vector(1150, 440),
               rotation_degrees=random.randint(0, 360)))