步骤7-添加硬币和声音#

接下来,我们将添加一些玩家可以拾取的硬币。我们还将添加一个声音,当他们拿起它时播放,以及当他们跳跃时的声音。
将硬币添加到场景中#
首先,我们需要将硬币添加到场景中。让我们首先在应用程序的顶部添加一个常量,用于Coin Sprite缩放,类似于我们的 TILE_SCALING
一。
COIN_SCALING = 0.5
接下来是我们的 setup
函数我们可以使用for循环创建我们的硬币,就像我们之前对地面所做的那样,然后将它们添加到场景中。
# Use a loop to place some coins for our character to pick up
for x in range(128, 1250, 256):
coin = arcade.Sprite(":resources:images/items/coinGold.png", COIN_SCALING)
coin.center_x = x
coin.center_y = 96
self.scene.add_sprite("Coins", coin)
加载声音#
现在我们可以加载我们的声音来收集硬币和跳跃。稍后,我们将使用这些变量在特定事件发生时播放声音。将以下内容添加到 __init__
加载声音的函数:
# Load sounds
self.collect_coin_sound = arcade.load_sound(":resources:sounds/coin1.wav")
self.jump_sound = arcade.load_sound(":resources:sounds/jump1.wav")
然后,我们可以在玩家跳跃时播放跳跃声音,方法是将它添加到 on_key_press
功能:
def on_key_press(self, key, modifiers):
"""Called whenever a key is pressed."""
if key == arcade.key.UP or key == arcade.key.W:
if self.physics_engine.can_jump():
self.player_sprite.change_y = PLAYER_JUMP_SPEED
arcade.play_sound(self.jump_sound)
elif key == arcade.key.LEFT or key == arcade.key.A:
self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
elif key == arcade.key.RIGHT or key == arcade.key.D:
self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
碰撞检测#
最后,我们需要找出玩家是否击中了硬币。我们可以在我们的 on_update
函数通过使用 arcade.check_for_collision_with_list
功能。我们可以传递玩家精灵,以及一个 SpriteList
用来装硬币的。该函数将返回玩家当前正在与之碰撞的硬币列表。如果接触中没有硬币,则列表将为空。
然后,我们可以使用 Sprite.remove_from_sprite_lists
该函数会将给定的精灵从其所属的任何SpriteList中删除,从而有效地将其从游戏中删除。
注解
请注意,图像周围的任何透明“空白”都算作Hitbox。您可以在图形编辑器中修剪空间,或者稍后,我们将介绍如何自定义Sprite的Hitbox。
将以下内容添加到 on_update
当玩家拿起硬币时,添加碰撞检测和播放声音的功能。
# See if we hit any coins
coin_hit_list = arcade.check_for_collision_with_list(
self.player_sprite, self.scene["Coins"]
)
# Loop through each coin we hit (if any) and remove it
for coin in coin_hit_list:
# Remove the coin
coin.remove_from_sprite_lists()
# Play a sound
arcade.play_sound(self.collect_coin_sound)
注解
花点时间把硬币放在你喜欢的地方。如果你有额外的时间,试着添加更多的硬币。还可以从提供的图形中添加宝石或钥匙。
您还可以将硬币精灵细分为子类,并为分值添加一个属性。然后你可以拥有价值1分的硬币,以及价值5分、10分和15分的宝石。
源代码#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | """ Platformer Game """ import arcade # Constants SCREEN_WIDTH = 1000 SCREEN_HEIGHT = 650 SCREEN_TITLE = "Platformer" # Constants used to scale our sprites from their original size CHARACTER_SCALING = 1 TILE_SCALING = 0.5 COIN_SCALING = 0.5 # Movement speed of player, in pixels per frame PLAYER_MOVEMENT_SPEED = 5 GRAVITY = 1 PLAYER_JUMP_SPEED = 20 class MyGame(arcade.Window): """ Main application class. """ def __init__(self): # Call the parent class and set up the window super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) # Our Scene Object self.scene = None # Separate variable that holds the player sprite self.player_sprite = None # Our physics engine self.physics_engine = None # A Camera that can be used for scrolling the screen self.camera = None # Load sounds self.collect_coin_sound = arcade.load_sound(":resources:sounds/coin1.wav") self.jump_sound = arcade.load_sound(":resources:sounds/jump1.wav") arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE) def setup(self): """Set up the game here. Call this function to restart the game.""" # Set up the Camera self.camera = arcade.Camera(self.width, self.height) # Initialize Scene self.scene = arcade.Scene() # Set up the player, specifically placing it at these coordinates. image_source = ":resources:images/animated_characters/female_adventurer/femaleAdventurer_idle.png" self.player_sprite = arcade.Sprite(image_source, CHARACTER_SCALING) self.player_sprite.center_x = 64 self.player_sprite.center_y = 128 self.scene.add_sprite("Player", self.player_sprite) # Create the ground # This shows using a loop to place multiple sprites horizontally for x in range(0, 1250, 64): wall = arcade.Sprite(":resources:images/tiles/grassMid.png", TILE_SCALING) wall.center_x = x wall.center_y = 32 self.scene.add_sprite("Walls", wall) # Put some crates on the ground # This shows using a coordinate list to place sprites coordinate_list = [[512, 96], [256, 96], [768, 96]] for coordinate in coordinate_list: # Add a crate on the ground wall = arcade.Sprite( ":resources:images/tiles/boxCrate_double.png", TILE_SCALING ) wall.position = coordinate self.scene.add_sprite("Walls", wall) # Use a loop to place some coins for our character to pick up for x in range(128, 1250, 256): coin = arcade.Sprite(":resources:images/items/coinGold.png", COIN_SCALING) coin.center_x = x coin.center_y = 96 self.scene.add_sprite("Coins", coin) # Create the 'physics engine' self.physics_engine = arcade.PhysicsEnginePlatformer( self.player_sprite, gravity_constant=GRAVITY, walls=self.scene["Walls"] ) def on_draw(self): """Render the screen.""" # Clear the screen to the background color self.clear() # Activate our Camera self.camera.use() # Draw our Scene self.scene.draw() def on_key_press(self, key, modifiers): """Called whenever a key is pressed.""" if key == arcade.key.UP or key == arcade.key.W: if self.physics_engine.can_jump(): self.player_sprite.change_y = PLAYER_JUMP_SPEED arcade.play_sound(self.jump_sound) elif key == arcade.key.LEFT or key == arcade.key.A: self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED elif key == arcade.key.RIGHT or key == arcade.key.D: self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED def on_key_release(self, key, modifiers): """Called when the user releases a key.""" if key == arcade.key.LEFT or key == arcade.key.A: self.player_sprite.change_x = 0 elif key == arcade.key.RIGHT or key == arcade.key.D: self.player_sprite.change_x = 0 def center_camera_to_player(self): screen_center_x = self.player_sprite.center_x - (self.camera.viewport_width / 2) screen_center_y = self.player_sprite.center_y - ( self.camera.viewport_height / 2 ) if screen_center_x < 0: screen_center_x = 0 if screen_center_y < 0: screen_center_y = 0 player_centered = screen_center_x, screen_center_y self.camera.move_to(player_centered) def on_update(self, delta_time): """Movement and game logic""" # Move the player with the physics engine self.physics_engine.update() # See if we hit any coins coin_hit_list = arcade.check_for_collision_with_list( self.player_sprite, self.scene["Coins"] ) # Loop through each coin we hit (if any) and remove it for coin in coin_hit_list: # Remove the coin coin.remove_from_sprite_lists() # Play a sound arcade.play_sound(self.collect_coin_sound) # Position the camera self.center_camera_to_player() def main(): """Main function""" window = MyGame() window.setup() arcade.run() if __name__ == "__main__": main() |