挂王之王----上天入地https://www.zhihu.com/video/1237047080927444992
步骤2-添加精灵
Setup vs. Init
在本次的代码示例中,我们将使用一个__init__方法和一个setup方法来设置游戏。
__init__只设置变量,但不创建任何类实例。它们只是默认为0或None。setup实际上会创建对象实例,例如图形精灵。
他们被一分为二是有原因的。有了一个分开的setup方法,以后我们可以很容易地在游戏中添加“重启/再次玩”功能。调用一个简单的setup函数将重置所有内容。我们还可以添加额外的关卡,如设置setup_level_1和setup_level_2。
在游戏中添加精灵
一旦我们成功启动窗口,下一步要做的就是放一些图形。“精灵”是可以与之交互的图形项目,例如玩家角色、硬币和墙壁。要使用“精灵”,我们将使用Sprite类。
我们通过创建sprite类的实例来创建精灵:
self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING))
将Sprite类引用提供给要使用的图像,并且(可选)可以将其放大或缩小。如果第二个参数是0.5,精灵是128x128,那么缩小50%后就是64x64。
接下来,我们需要知道精灵去了哪里。可以使用属性center_x和center_y定位精灵。您还可以使用“上”、“下”、“左”和“右”来获取或设置精灵的位置,让它不是在中心。也可以使用position属性同时设置x和y。self.player_sprite.center_x = 64
self.player_sprite.center_y = 120
最后,Sprite类的所有实例都需要进入SpriteList类。self.player_list.append(self.player_sprite)
我们根据精灵所在的列表来管理它们。在下面的示例中,有一个wall_list,其中包含玩家角色无法通过的所有内容,还有一个coin_list,其中包含了我们可以用来获取点数的精灵。还有一个coin_list,里面只有玩家。
请注意,代码通过三种方式创建精灵:
1. 创建一个Sprite类,定位它,将它添加到列表中
2. 在循环中创建一系列精灵
3. 使用坐标创建一系列精灵
"""Platformer Game02_draw_sprites - 绘制指定位置的精灵"""
import arcade
# 定义常量,屏幕的宽、高和标题
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 650
SCREEN_TITLE = "Platformer"
# 用于缩放精灵原始大小的常数
CHARACTER_SCALING = 1
TILE_SCALING = 0.5
COIN_SCALING = 0.5
class MyGame(arcade.Window):
"""封装成的主类"""
def __init__(self):
# 初始化父类并设置窗口
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
# 这些是跟踪我们精灵的“列表”。每个精灵应该
# 被放入列表.
self.coin_list = None
self.wall_list = None
self.player_list = None
# 保存玩家精灵的单独变量
self.player_sprite = None
arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
def setup(self):
""" 在这里设置游戏。调用此函数重新启动游戏. """
# 创建精灵列表
self.player_list = arcade.SpriteList()
self.wall_list = arcade.SpriteList()
self.coin_list = arcade.SpriteList()
# 设置玩家,注意将其放置在指定坐标处.
image_source = "images/player_1/player_stand.png"
self.player_sprite = arcade.Sprite(image_source, CHARACTER_SCALING)
self.player_sprite.center_x = 64
self.player_sprite.center_y = 128
self.player_list.append(self.player_sprite)
# 创建背景
# 这显示了如何使用循环水平放置多个精灵
for x in range(0, 1250, 64):
wall = arcade.Sprite("images/tiles/grassMid.pngg", TILE_SCALING)
wall.center_x = x
wall.center_y = 32
self.wall_list.append(wall)
# 把一些板条箱放在地上
# 这显示了如何使用坐标列表来放置精灵
coordinate_list = [[512, 96],
[256, 96],
[768, 96]]
for coordinate in coordinate_list:
# 添加一个地板
wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
wall.position = coordinate
self.wall_list.append(wall)
def on_draw(self):
""" 渲染屏幕 """
# 将屏幕设置为背景色
arcade.start_render()
# 画出我们的精灵
self.wall_list.draw()
self.coin_list.draw()
self.player_list.draw()
def main():
""" 主函数,大佬们往往把功能封装成类在main函数里写测试的代码,如果直接运行该脚本就会运行测试"""
window = MyGame()
window.setup()
arcade.run()
if __name__ == "__main__":
main()
备注:代码示例启动并运行后:
1. 调整代码并尝试将精灵放置在新位置。
2. 对精灵使用不同的图像(请参见“图像”文件夹)
3. 练习通过循环和列表中的坐标单独放置。
步骤3-添加用户控制
现在我们需要能够让用户移动。如何做到这一点:
1. 每个精灵都有center_x和center_y属性。更改这些将更改精灵的位置。(也有将移动精灵的顶部、底部、左侧、右侧和角度的属性。)
2. 每个精灵都有change_x和change_y变量。这些可以用来保持精灵移动的速度。我们将根据用户点击的键调整这些。如果用户点击右箭头键,我们希望更改x的值为正值。如果值为5,则每帧移动5像素。
3.我们可以在精灵列表上调用update 方法,它将根据它们的速度移动所有精灵。我们也可以使用一个(非常)简单的物理引擎physicenginesimple类来移动精灵,但不能让它们穿过墙壁。
"""Platformer Game03_user_control.py - 通过键盘控制玩家"""
import arcade
# 定义常量,屏幕的宽、高和标题
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 650
SCREEN_TITLE = "Platformer"
# 用于缩放精灵原始大小的常数
CHARACTER_SCALING = 1
TILE_SCALING = 0.5
COIN_SCALING = 0.5
# 玩家的移动速度,以每帧像素为单位
PLAYER_MOVEMENT_SPEED = 5
class MyGame(arcade.Window):
"""封装成的主类"""
def __init__(self):
# 初始化父类并设置窗口
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
# 这些是跟踪我们精灵的“列表”。每个精灵应该
# 被放入列表.
self.coin_list = None
self.wall_list = None
self.player_list = None
# 保存玩家精灵的单独变量
self.player_sprite = None
# 我们的物理引擎
self.physics_engine = None
arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
def setup(self):
""" 在这里设置游戏。调用此函数重新启动游戏. """
# 创建精灵列表
self.player_list = arcade.SpriteList()
self.wall_list = arcade.SpriteList()
self.coin_list = arcade.SpriteList()
# 设置玩家,注意将其放置在指定坐标处.
image_source = "images/player_1/player_stand.png"
self.player_sprite = arcade.Sprite(image_source, CHARACTER_SCALING)
self.player_sprite.center_x = 64
self.player_sprite.center_y = 128
self.player_list.append(self.player_sprite)
# 创建背景
# 这显示了如何使用循环水平放置多个精灵
for x in range(0, 1250, 64):
wall = arcade.Sprite("images/tiles/grassMid.pngg", TILE_SCALING)
wall.center_x = x
wall.center_y = 32
self.wall_list.append(wall)
# 把一些板条箱放在地上
# 这显示了如何使用坐标列表来放置精灵
coordinate_list = [[512, 96],
[256, 96],
[768, 96]]
for coordinate in coordinate_list:
# 添加一个地板
wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
wall.position = coordinate
self.wall_list.append(wall)
# 添加物理引擎
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
def on_draw(self):
""" 渲染屏幕 """
# 将屏幕设置为背景色
arcade.start_render()
# 画出我们的精灵
self.wall_list.draw()
self.coin_list.draw()
self.player_list.draw()
def on_key_press(self, key, modifiers):
"""每当按下键时调用 . """
if key == arcade.key.UP or key == arcade.key.W:
self.player_sprite.change_y = PLAYER_MOVEMENT_SPEED
elif key == arcade.key.DOWN or key == arcade.key.S:
self.player_sprite.change_y = -PLAYER_MOVEMENT_SPEED
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):
"""每当释放键时调用. """
if key == arcade.key.UP or key == arcade.key.W:
self.player_sprite.change_y = 0
elif key == arcade.key.DOWN or key == arcade.key.S:
self.player_sprite.change_y = 0
elif 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 on_update(self, delta_time):
""" 移动画面与游戏逻辑 """
# 用物理引擎移动玩家
self.physics_engine.update()
def main():
""" 主函数,大佬们往往把功能封装成类在main函数里写测试的代码,如果直接运行该脚本就会运行测试"""
window = MyGame()
window.setup()
arcade.run()
if __name__ == "__main__":
main()
备注:如果您对一种更好的、更复杂的键盘控制方法感兴趣,请参见此示例和“按键盘移动”示例之间的区别。叫我彪哥:python游戏库:Arcade教程(3)zhuanlan.zhihu.com