大家好!
我们将继续与您分享有关小python的有趣发现。 今天,我们决定处理2D游戏。 当然,这比我们在
Python Developer课程中所学的要简单一些,但是当然也同样有趣。
转让原始文章-opensource.com/article/18/4/easy-2d-game-creation-python-and-arcade
保罗·文森特·克雷文(Paul Vincent Craven)发表走吧
Python是供初学者学习编程的杰出语言。 对于那些想要“随手拿走”而不是花大量时间编写样板代码的人来说,它也是理想的选择。
Arcade是一个Python库,用于创建2D游戏,入门门槛低,但经验丰富的人却可以使用。 在本文中,我将解释如何开始使用Python和Arcade对游戏进行编程。
在
向学生讲解
PyGame库的基础知识之后,我便开始在Arcade上进行开发。 我已经亲自教授PyGames已有10年了,还开发了
ProgramArcadeGames.com进行在线学习。 PyGames很棒,但是在某个时候,我意识到我已经厌倦了浪费时间证明
无法修复的错误 。
我担心教诸如
事件循环之类的东西,这些东西几乎从未使用过。
在整个章节中,我解释了为什么y坐标沿相反方向旋转。 PyGames很少更新,它基于旧的
SDL 1库,而不是像
OpenGL这样的更现代的库。 我没有指望光明的未来。
在我的梦想中,有一个简单而强大的库将使用Python 3的新功能,例如装饰器和类型提示。 她原来是Arcade。 让我们看看如何开始使用它。

安装方式
像许多其他软件包一样,Arcade可以在
PyPi上
使用 ,这意味着您可以使用pip(或
pipenv )
命令安装Arcade。 如果已经安装了Python,则很可能只需打开Windows命令提示符并编写:
pip install arcade
在Linux和MacOS上:
pip3 install arcade
有关更详细的安装说明,请阅读Arcade安装
文档 。
简单绘图
您可以打开窗口并仅用几行代码即可绘制一个简单的图形。 例如,让我们画一个笑脸,如下图:

下面的脚本显示了如何使用Arcade绘图
命令执行此
操作 。 请注意,您不必知道如何使用类或定义函数。 快速的视觉反馈编程对于刚开始学习的人来说是一个好的开始。
import arcade
使用功能
当然,在全局上下文中编写代码不是最佳方法。 幸运的是,使用函数将有助于改善您的代码。 下面是使用函数在给定坐标(x,y)上绘制树的示例:
def draw_pine_tree(x, y): """ """
有关完整示例,请参见
带有功能的
图纸 。

更有经验的程序员知道,现代程序首先将图形信息上传到视频卡,然后要求其绘制批处理文件。
支持Arcade,单独绘制10,000个矩形需要0.8秒。 用批处理文件绘制相同的数量将花费少于0.001秒的时间。
窗类
大型程序通常基于
Window类或使用
装饰器 。 这使程序员可以编写代码来控制用户输入的呈现,更新和处理。 下面是带有基于Windows的程序的模板。
import arcade SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 class MyGame(arcade.Window): """ . """ def __init__(self, width, height): super().__init__(width, height) arcade.set_background_color(arcade.color.AMAZON) def setup(self):
Window类具有几种方法,您的程序可以覆盖这些方法以提供功能。 以下是最常用的列表:
- on_draw:所有用于渲染屏幕的代码都在这里。
- 更新:所有用于移动物体和制定游戏逻辑的代码都在这里。 每秒调用约60次。
- on_key_press:处理按下按钮时的事件,例如角色的移动。
- on_key_release:释放按钮时处理事件,例如停止字符。
- on_mouse_motion:每次鼠标移动时调用。
- on_mouse_press:单击鼠标按钮时调用。
- set_viewport:当世界远大于一个屏幕上的可见范围时,此功能可在滚动条中使用。 调用set_viewport可使程序员指定屏幕上可见的部分。
精灵
Sprite是在Arcade中创建2D位图要素的简便方法。 它具有使绘制,移动和设置精灵动画变得容易的方法。 您还可以使用精灵来跟踪对象之间的碰撞。
精灵创建
创建Arcite
Sprite实例非常容易。 程序员仅需要精灵将基于的图像文件的名称,以及可选的放大或缩小图像的次数。 例如:
SPRITE_SCALING_COIN = 0.2 coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)
这段代码使用图片coin_01.png创建了一个精灵。 图片将缩小为原始图像的20%。
精灵列表
精灵通常组织成列表。 它们有助于简化管理。 列表中的精灵将使用OpenGl进行组批渲染。 下面的代码设置了游戏,其中有一个玩家和很多玩家必须收集的硬币。 我们使用两个列表-一个用于玩家,另一个用于硬币。
def setup(self): """ . """
我们可以轻松地绘制硬币列表中的所有硬币:
def on_draw(self): """ """ arcade.start_render() self.coin_list.draw() self.player_list.draw()
跟踪精灵碰撞
使用check_for_collision_with_list函数可以查看一个精灵是否与列表中的另一个精灵碰面。 我们用它来查看玩家的精灵与之相交的所有硬币。 使用简单的for循环,您可以摆脱游戏中的硬币并提高得分。
def update(self, delta_time):
可以在
collect_coins.py中找到完整的示例。
游戏物理
许多游戏以一种形式或另一种形式具有物理学。 例如,最简单的是自上而下的游戏不允许玩家穿过墙壁。 平台开发人员增加了重力和移动平台的复杂性。 一些游戏使用具有质量,摩擦力,弹簧等的成熟的物理2D引擎。
自上而下的游戏

对于具有顶视图的简单游戏,“街机”程序需要玩家无法通过的墙壁列表(或类似内容)。 我通常将其称为wall_list。 然后,在Window类的安装代码中创建一个物理引擎:
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
player_sprite接收具有两个属性change_x和change_y的运动矢量。 一个简单的用例是使用键盘移动播放器。
MOVEMENT_SPEED = 5 def on_key_press(self, key, modifiers): """ """ if key == arcade.key.UP: self.player_sprite.change_y = MOVEMENT_SPEED elif key == arcade.key.DOWN: self.player_sprite.change_y = -MOVEMENT_SPEED elif key == arcade.key.LEFT: self.player_sprite.change_x = -MOVEMENT_SPEED elif key == arcade.key.RIGHT: self.player_sprite.change_x = MOVEMENT_SPEED def on_key_release(self, key, modifiers): """, """ if key == arcade.key.UP or key == arcade.key.DOWN: self.player_sprite.change_y = 0 elif key == arcade.key.LEFT or key == arcade.key.RIGHT: self.player_sprite.change_x = 0
尽管该代码设置了播放器的速度,但他并没有移动它。 Window类中的update方法调用physics_engine.update(),它将使播放器移动,但不能穿过墙壁。
def update(self, delta_time): """ """ self.physics_engine.update()
完整的示例可以在
sprite_move_walls.py中找到。
平台游戏

切换到带有侧视图的平台游戏非常简单。 程序员需要将物理引擎切换为PhysicsEnginePlatformer并添加重力常数。
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite, self.wall_list, gravity_constant=GRAVITY)
要添加关卡将要组成的图块和块,可以使用
Tiled之类的程序。
在
sprite_tiled_map.py上有一个示例
。从例子中学习
以身作则是最好的方法之一。 Arcade库包含大量
示例程序 ,您可以在创建游戏时关注这些
示例程序 。 这些示例揭示了我的在线和离线学生多年来一直要求的游戏概念。
在安装了Arcade的情况下运行演示并不困难。 在每个示例的程序开头,都有注释,您需要在命令行上输入命令才能运行此示例。 例如:
python -m arcade.examples.sprite_moving_platforms
结束
与往常一样,我们正在等待您的评论和问题,您可以在这里
开放或在
开放日前往
Stas 。