【Python项目实战】主流游戏引擎(中)

前情回顾

上一期我们为大家介绍了Python游戏引擎的一些相关知识及其与专业的游戏引擎各有什么优缺点,最后从安装方法基础概念主要功能代码实现四部分介绍了Python最流行的游戏引擎Pygame,还没看的小伙伴建议先预习下:

【Python项目实战】主流游戏引擎(中)
【Python项目实战】主流游戏引擎(上)

本期将按相同的组织目录为大家介绍另外两款热门的Python游戏引擎——Pygame ZeroArcade

Pygame Zero

Pygame在很多方面都做得很好,但同时它也存在不足之处。对于游戏编写新手来说,Pygame Zero是一个更好的选择。Pygame Zero是完全为教育而设计的,它遵循一套简单的原则,旨在让年轻和初级程序员更易上手,先总结下它的有点:

上手成本低:所有东西都是为初级程序员设计的。通用性更强:支持通用平台,避免实验性特性。丰富的文档:文档非常丰富,方便快速查阅。兼容性良好:各个版本之间的兼容性强。

Pygame Zero的文档对于初学者来说是非常容易理解的,它包括一个完整的循序渐进的教程。此外,Pygame Zero团队意识到许多初级程序员都是从Scratch开始编码的,所以他们提供了一个教程,演示如何将Scratch程序迁移到Pygame Zero

Installation

Pygame Zero可以在PyPI上使用,你可以像在WindowsmacOSLinux上安装任何其他Python库一样安装它:

$ python -m pip install pgzero

Pygame Zero,顾名思义,是构建在Pygame之上的,因此这一步还将Pygame安装为一个依赖库。

Basic Concepts

Pygame Zero自动化了许多程序员必须在Pygame中手动完成的工作。默认情况下,Pygame Zero提供给游戏创建者以下功能:

  • 自动化游戏循环
  • 处理绘图、更新和输入处理的事件模型
  • 统一的图像、文本和声音处理
  • 一个可用的精灵类和有用的动画方法的用户精灵

Basic Application

有了这些组件,我们可以用很少的代码量完成Pygame Zero游戏的开发:

Show/Hide
 
"""
Basic "Hello, World!" program in Pygame Zero

This program is designed to demonstrate the basic capabilities
of Pygame Zero. It will:
- Create a game window
- Fill the background with white
- Draw some basic shapes in different colors
- Draw some text in a specified size and color
"""


# Import pgzrun allows the program to run in Python IDLE
import pgzrun

# Set the width and height of your output window, in pixels
WIDTH = 800
HEIGHT = 600

def draw():
  """Draw is called once per frame to render everything on the screen"""

  # Clear the screen first
  screen.clear()

  # Set the background color to white
  screen.fill("white")

  # Draw a blue circle with a radius of 50 in the center of the screen
  screen.draw.filled_circle(
      (WIDTH // 2, HEIGHT // 2), 50"blue"
  )

  # Draw a red-outlined square in the top-left corner of the screen
  red_square = Rect((5050), (100100))
  screen.draw.rect(red_square, (20000))

  # Draw an orange caption along the bottom in 60-point font
  screen.draw.text(
      "Hello, World! From Pygame Zero!",
      (100, HEIGHT - 50),
      fontsize=60,
      color="orange",
  )

# Run the program
pgzrun.go()



Pygame Zero识别出第16行和第17行的WIDTHHEIGHT常量指向窗口的大小,并自动使用这些尺寸来创建窗口。另外,Pygame Zero提供了一个内置的游戏循环,并每帧调用一次第1943行中定义的draw()函数来呈现屏幕。

因为Pygame Zero基于Pygame,所以继承了一些形状绘制代码。你可以看到在第29行画圆和在第3435行画正方形的相似之处:

【Python项目实战】主流游戏引擎(中)
Powered by Pygame Zero

但是,文本绘图现在是第3843行上的一个函数调用,而不是三个单独的函数。

Pygame Zero还提供了基本的窗口处理代码,因此你可以通过单击适当的关闭按钮关闭窗口,而不需要事件处理程序。

精灵Pygame Zero中被称为角色

  1. Pygame Zero提供了Actor类。每个Actor至少有一个图像和一个位置。
  2. Pygame Zero程序中使用的所有图像必须位于一个名为./images/的子文件夹中,并且只能使用小写字母、数字和下划线命名。
  3. 仅使用映像的基名引用映像。例如,如果你的图像是alien.png,你在你的程序中的引用格式为alien

下面举一个简单的例子:

alien = Actor("alien")
alien.pos = 10056

WIDTH = 500
HEIGHT = alien.height + 20

def draw():
    screen.clear()
    alien.draw()

Advanced Applicatio

为了演示游戏引擎之间的区别,让我们复现一下上一篇在Pygame中实现的吃金币游戏,完整代码可访问此链接。

Pygame Zero使用152行代码实现了与182Pygame代码相同的游戏。虽然这些行数是可以比较的,但Pygame Zero版本可以说比Pygame版本更简洁、更模块化,而且可能更容易理解和编码。

【Python项目实战】主流游戏引擎(中)
pgzero-game

Arcade

Arcade是一个现代化的Python框架,用于制作更加迷人的图像声音游戏。基于面向对象的设计,Arcade为游戏作者提供了一套现代的工具来制作优秀的Python游戏体验。

Arcade是由美国爱荷华州辛普森学院的Paul Craven教授设计的,它建立在微型窗户和多媒体库基础之上。它提供了一系列比PygamePygame Zero更先进的体验:

  • 支持OpenGL游戏引擎渲染
  • 支持Python3类型提示
  • 支持基于框架的动画精灵
  • 采用一致的命令、函数和参数名称
  • 鼓励将游戏逻辑与显示代码分离
  • 需要更少的样板代码
  • 提供维护良好和最新的文档,包括教程和完整的Python游戏示例
  • 为自上而下和平台游戏内置物理引擎
  • 社区活跃且功能版本持续迭代优化

Installation

python -m pip install arcade

Basic Concept

Arcade的窗口坐标原点(0, 0)位于屏幕的左下角,y坐标随着向上移动而增加。这与许多其他游戏引擎不同,后者将原点放置在左上角。

从本质上讲,Arcade是一个面向对象的库。虽然可以程序化地编写Arcade应用程序,但当你创建完全面向对象的代码时,它的真正力量才会显露出来。

Pygame Zero一样,Arcade也提供了内置的游戏循环和定义良好的事件模型,所以你最终能够获得非常干净且可读的游戏代码。不仅如此,Arcade还提供了一个强大的精灵类,帮助渲染、定位和碰撞检测。此外,街机精灵可以通过提供多个图像进行动画化。

下面列出同以上两个框架实现同等功能的源代码arcade_basic.py:

Show/Hide
 
"""
Basic "Hello, World!" program in Arcade

This program is designed to demonstrate the basic capabilities
of Arcade. It will:
- Create a game window
- Fill the background with white
- Draw some basic shapes in different colors
- Draw some text in a specified size and color
"""


# Import arcade allows the program to run in Python IDLE
import arcade

# Set the width and height of your output window, in pixels
WIDTH = 800
HEIGHT = 600

# Classes
class ArcadeBasic(arcade.Window):
  """Main game window"""

  def __init__(self, width: int, height: int, title: str):
      """Initialize the window to a specific size

      Arguments:
          width {int} -- Width of the window
          height {int} -- Height of the window
          title {str} -- Title for the window
      """


      # Call the parent class constructor
      super().__init__(width, height, title)

      # Set the background window
      arcade.set_background_color(color=arcade.color.WHITE)

  def on_draw(self):
      """Called once per frame to render everything on the screen"""

      # Start rendering
      arcade.start_render()

      # Draw a blue circle with a radius of 50 in the center of the screen
      arcade.draw_circle_filled(
          center_x=WIDTH // 2,
          center_y=HEIGHT // 2,
          radius=50,
          color=arcade.color.BLUE,
          num_segments=50,
      )

      # Draw a red-outlined square in the top-left corner of the screen
      arcade.draw_lrtb_rectangle_outline(
          left=50,
          top=HEIGHT - 50,
          bottom=HEIGHT - 100,
          right=100,
          color=arcade.color.RED,
          border_width=3,
      )

      # Draw an orange caption along the bottom in 60-point font
      arcade.draw_text(
          text="Hello, World! From Arcade!",
          start_x=100,
          start_y=50,
          font_size=28,
          color=arcade.color.ORANGE,
      )

# Run the program
if __name__ == "__main__":
  arcade_game = ArcadeBasic(WIDTH, HEIGHT, "Arcade Basic Game")
  arcade.run()



类似的,我们可以获得以下输出图案:

【Python项目实战】主流游戏引擎(中)
arcade-basic

如上所述,Arcade程序可以写成完全面向对象的代码。例如,在第33行调用super().__init()确保游戏窗口被正确设置。

Arcade每帧调用第3870行中定义的.on_draw()事件处理程序一次,将所有内容呈现到屏幕上。这个方法首先调用.start_render()``,它告诉Arcade为绘图准备窗口。这与Pygame .flip()调用在Pygame`绘图步骤结束时所需的调用相当。

Arcade中的每一个基本的形状绘制方法都是从draw_*开始的,需要一条线来完成。街机内置绘图支持众多的形状。

Arcade 配备了数百种颜色包,但你也可以使用RGBRGBA元组选择你自己喜欢的颜色。

Advanced Application

为了展示Arcade与其他游戏引擎的区别,你将看到之前的相同游戏。这里再次给大家复习下游戏细节:

  • 玩家是屏幕上的一个精灵,通过移动鼠标进行控制。
  • 每隔一定的时间,硬币就会一个接一个地出现在屏幕上。
  • 当玩家移动到每一枚硬币上时,它就会消失,玩家将获得10分。
  • 随着游戏的发展,玩家会更快地添加金币。
  • 当屏幕上出现十多个硬币时,游戏结束。

具体的代码教程可以点击此链接。

【Python项目实战】主流游戏引擎(中)
arcade-game

Arcade的面向对象特性允许我们通过将游戏的初始化与每个不同关卡的初始化分开来快速实现不同的关卡。游戏在第40行到63行的.__init__()方法中初始化,而在第65行到85行中使用单独的.setup()方法设置关卡并重新启动。这是一种很棒的模式,甚至适用于只有一个关卡的游戏。

精灵是通过创建一个arcade.Sprite类来定义,同时提供了图像路径。Arcade支持pathlib路径,这简化了第7275行玩家精灵的创建。

创建新硬币在第78行到第80行处理,这一行调用arcade.schedule()以定期调用self.add_coin()方法。

在第87行到120行中定义的.add_coin()方法在随机位置创建一个新的硬币精灵,并将其添加到列表中,以简化绘图和稍后的碰撞处理。

要使用鼠标移动玩家,你需要在第122134行实现.on_mouse_motion()方法。arcade.clamp()方法确保玩家的中心坐标永远不会离开屏幕。

检查玩家和硬币之间的碰撞是在第144156行的.on_update()方法中处理的。arcade.check_for_collision_with_list()方法返回列表中与指定的精灵发生冲突的所有精灵的列表。代码遍历该列表,增加分数并在删除每个硬币之前播放声音效果。

“.on_update()方法还检查屏幕上第159行到第168`行是否有过多的硬币。如果是这样,游戏就结束了。

Arcade的实现和Pygame Zero代码一样具有可读性和良好的结构,尽管它的代码比Pygame Zero27%``,共写了194行。较长的代码可能是值得的,因为Arcade`提供了更多的功能没有在这里演示,例如:

  • 动画精灵
  • 几个内置物理引擎
  • 支持第三方游戏地图
  • 更全面的着色系统

来自Python Zero的新游戏作者会发现Arcade在结构上与之相似,但其提供了更强大和通用的功能。


好了,本期内容到此为止,下期我们将为大家介绍剩余的一些Python游戏引擎,但不会再给予详细的教程,有兴趣的小伙伴可以自行查阅相关资料进行学习。最后我们会为大家做一个全面的阶段性总结,让我们下期再见,不见不散。



往期回顾

【Python项目实战】主流游戏引擎(上)
【Python项目实战】网页爬取(上)
【Python项目实战】网页爬取(中)
【Python项目实战】网页爬取(下)
Python-Turtle库-从入门到精通
【不可不知系列】编译器|编辑器|集成开发环境的区别和联系



原文始发于微信公众号(Pytrick):【Python项目实战】主流游戏引擎(中)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/56389.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!