使用Arcade库在Python中创建2D游戏

大家好!

我们将继续与您分享有关小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 #      SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 #  .      (  ) arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing Example") #    . #      : # http://arcade.academy/arcade.color.html #      (, , )  # (, , , ) . arcade.set_background_color(arcade.color.WHITE) #   .       arcade.start_render() #   x = 300 y = 300 radius = 200 arcade.draw_circle_filled(x, y, radius, arcade.color.YELLOW) #    x = 370 y = 350 radius = 20 arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK) #    x = 230 y = 350 radius = 20 arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK) #   x = 300 y = 280 width = 120 height = 100 start_angle = 190 end_angle = 350 arcade.draw_arc_outline(x, y, width, height, arcade.color.BLACK, start_angle, end_angle, 10) #      arcade.finish_render() #      ,      “” arcade.run() 

使用功能


当然,在全局上下文中编写代码不是最佳方法。 幸运的是,使用函数将有助于改善您的代码。 下面是使用函数在给定坐标(x,y)上绘制树的示例:

 def draw_pine_tree(x, y): """       """ #    . #   x, y    . arcade.draw_triangle_filled(x + 40, y, # Point 1 x, y - 100, # Point 2 x + 80, y - 100, # Point 3 arcade.color.DARK_GREEN) #   arcade.draw_lrtb_rectangle_filled(x + 30, x + 50, y - 100, y - 140, arcade.color.DARK_BROWN) 

有关完整示例,请参见带有功能图纸



更有经验的程序员知道,现代程序首先将图形信息上传到视频卡,然后要求其绘制批处理文件。 支持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): #    pass def on_draw(self): """   . """ arcade.start_render() #    def update(self, delta_time): """       .""" pass def main(): game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT) game.setup() arcade.run() if __name__ == "__main__": main() 

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): """     . """ #    self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() #  self.score = 0 #    #    kenney.nl self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 #   self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) #   for i in range(COIN_COUNT): #    #     kenney.nl coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) #    coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT) #     self.coin_list.append(coin) 


我们可以轻松地绘制硬币列表中的所有硬币:

 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): #     ,    . coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list) #      ,     . for coin in coins_hit_list: coin.kill() self.score += 1 

可以在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

Source: https://habr.com/ru/post/zh-CN419761/


All Articles