pymunk_demo_platformer_11.py Diff#
--- /home/docs/checkouts/readthedocs.org/user_builds/arcade-library/checkouts/latest/doc/tutorials/pymunk_platformer/pymunk_demo_platformer_10.py
+++ /home/docs/checkouts/readthedocs.org/user_builds/arcade-library/checkouts/latest/doc/tutorials/pymunk_platformer/pymunk_demo_platformer_11.py
@@ -186,6 +186,7 @@
self.wall_list: Optional[arcade.SpriteList] = None
self.bullet_list: Optional[arcade.SpriteList] = None
self.item_list: Optional[arcade.SpriteList] = None
+ self.moving_sprites_list: Optional[arcade.SpriteList] = None
# Track the current state of what key is pressed
self.left_pressed: bool = False
@@ -224,6 +225,11 @@
self.player_sprite.center_y = SPRITE_SIZE * grid_y + SPRITE_SIZE / 2
# Add to player sprite list
self.player_list.append(self.player_sprite)
+
+ # Moving Sprite
+ self.moving_sprites_list = arcade.tilemap.process_layer(my_map,
+ 'Moving Platforms',
+ SPRITE_SCALING_TILES)
# --- Pymunk Physics Engine Setup ---
@@ -289,6 +295,10 @@
self.physics_engine.add_sprite_list(self.item_list,
friction=DYNAMIC_ITEM_FRICTION,
collision_type="item")
+
+ # Add kinematic sprites
+ self.physics_engine.add_sprite_list(self.moving_sprites_list,
+ body_type=arcade.PymunkPhysicsEngine.KINEMATIC)
def on_key_press(self, key, modifiers):
"""Called whenever a key is pressed. """
@@ -396,10 +406,37 @@
# Move items in the physics engine
self.physics_engine.step()
+ # For each moving sprite, see if we've reached a boundary and need to
+ # reverse course.
+ for moving_sprite in self.moving_sprites_list:
+ if moving_sprite.boundary_right and \
+ moving_sprite.change_x > 0 and \
+ moving_sprite.right > moving_sprite.boundary_right:
+ moving_sprite.change_x *= -1
+ elif moving_sprite.boundary_left and \
+ moving_sprite.change_x < 0 and \
+ moving_sprite.left > moving_sprite.boundary_left:
+ moving_sprite.change_x *= -1
+ if moving_sprite.boundary_top and \
+ moving_sprite.change_y > 0 and \
+ moving_sprite.top > moving_sprite.boundary_top:
+ moving_sprite.change_y *= -1
+ elif moving_sprite.boundary_bottom and \
+ moving_sprite.change_y < 0 and \
+ moving_sprite.bottom < moving_sprite.boundary_bottom:
+ moving_sprite.change_y *= -1
+
+ # Figure out and set our moving platform velocity.
+ # Pymunk uses velocity is in pixels per second. If we instead have
+ # pixels per frame, we need to convert.
+ velocity = (moving_sprite.change_x * 1 / delta_time, moving_sprite.change_y * 1 / delta_time)
+ self.physics_engine.set_velocity(moving_sprite, velocity)
+
def on_draw(self):
""" Draw everything """
self.clear()
self.wall_list.draw()
+ self.moving_sprites_list.draw()
self.bullet_list.draw()
self.item_list.draw()
self.player_list.draw()