第3步-场景对象#
接下来,我们将在游戏中添加一个场景。场景是一种通过为每个SpriteList指定名称并维护绘制顺序来管理多个不同SpriteList的工具。
SpriteList可以像我们在本教程的步骤2中看到的那样直接绘制,但是一个场景可以帮助您同时处理许多不同的列表,并且能够通过一个场景调用来绘制所有这些列表。
首先,我们将从 __init__
函数,并用场景对象替换它们。
03_场景_对象.py-场景对象定义#
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
arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
接下来,我们将在 setup
函数,然后向其中添加SpriteList,而不是直接创建新的SpriteList对象。
然后,我们可以将Sprite添加到场景中,并按名称指定要将它们添加到的SpriteList,而不是直接将Sprite附加到SpriteList。
03_Scene_object.py-将SpriteList添加到场景#
def setup(self):
"""Set up the game here. Call this function to restart the game."""
# Initialize Scene
self.scene = arcade.Scene()
# Create the Sprite lists
self.scene.add_sprite_list("Player")
self.scene.add_sprite_list("Walls", use_spatial_hash=True)
# 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)
最后,在我们的 on_draw
函数,我们可以画出场景。
03_SCENCE_OBJECT.py-绘制场景#
def on_draw(self):
"""Render the screen."""
# Clear the screen to the background color
self.clear()
# Draw our Scene
self.scene.draw()
源代码#
03_场景_对象-场景对象#
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 | """ 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 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 arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE) def setup(self): """Set up the game here. Call this function to restart the game.""" # Initialize Scene self.scene = arcade.Scene() # Create the Sprite lists self.scene.add_sprite_list("Player") self.scene.add_sprite_list("Walls", use_spatial_hash=True) # 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) def on_draw(self): """Render the screen.""" # Clear the screen to the background color self.clear() # Draw our Scene self.scene.draw() def main(): """Main function""" window = MyGame() window.setup() arcade.run() if __name__ == "__main__": main() |