1.1.    游戏库简介

游戏的世界精彩纷呈,有动作类、策略类、角色扮演类等诸多类型,还有很多难以分类的小游戏,让人玩起来往往爱不释手。 在 Python中,用于游戏开发的类库不少, 有PygamePygletCocos2dArCadePanda3D,等等。《Python趣味编程:从入门到人工智能》这本书的作者选择了Pyglet

Pyglet 是一个专门为 Python 语言开发的多媒体库,用于开发游戏和其他交互丰富的可视化应用程序。它简单易用且功能强大,是初学者学习游戏的理想选择。

   令人尴尬的是,Julia语言的游戏开发库着实匮乏。在Julia官方的“juliapackages”网站上,游戏库被分类到“Graphics”目录下,可见其溃乏程度。不过其中还是收录了“SFML.jl”、“Quake2.jl”、“AtariAlgos.jl”、“ArcadeLearningEnvironment.jl”、“SpaceShooter.jl”这些游戏库。都是些名不见经传的库。只有SFML.jl库的分量重一些,但是其底层绑定的是C++游戏和多媒体库SFML,套个Julia的壳而已。不过本文要介绍给大家的是另一个库:GameZero.jl,不仅因为它长得更像一个游戏 库,而且它与Python颇有渊源。

;

   GameZero.jl是一个开源游戏库,是为初学者、学生及其教师设计的简单易用的游戏开发框架。尤其是那些学习过Scratch并希望更上一个台阶的学生,官方推荐使用这个游戏库。本文之所以采用这款游戏库,首先是因为这款游戏库的设计灵感来源于一款Python游戏库“PyGameZero”(当然进行了独立设计,并非照搬);其次它很适合入门者学习。另外,它的名气相对其他Julia游戏开发库要大一些。在2021年Juliacon开发者大会上,7月22日下午的一个活动就是以GameZero游戏开发为主题的。

  由于GameZero与Pyglet的实现机制差异较大,本章节将不采用前几章的模式,寻求Julia和Python的代码实现一一对应,而是主要以GameZero为主,在介绍GameZero特点以及采用它开发游戏的同时,凡是能与Pyglet进行比较的地方,着重阐述他们的异同。

1.2.    准备工作

  1. 安装GameZero库

    在第二章的第一节我们介绍过Julia的库(或称包)安装的方法--打开REPL环境,按照下面的方法安装库:

    julia> import Pkg

    julia> Pkg.add("库名称")

  事实上,Pkg是Julia的内置包管理器,处理安装、更新和删除包等操作。可以通过从Julia REPL中按“ ]”键 输入Pkg REPL。要返回到Julia REPL,请按Backspace或Ctrl+ C键。

    进入Pkg REPL后,你应该会看到类似的提示

    (v1.1) pkg>

    要添加软件包,请使用 add :

    (v1.1) pkg> add Example

    可以通过在 @ 符号后附加版本号来安装特定版本,例如在包名称后附加 @v0.4:

    (v1.1) pkg> add Example@v0.4

    以上是注册的软件包的安装。Pkg 也支持使用未注册的软件包。要添加一个未注册的软件包,请指定一个 URL

    (v1.1) pkg> add https://github.com/JuliaLang/Example.jl

    除了以上的安装方式,还有以下方式,就不一一解释了:

    pkg> add Example#master

       pkg> add Example#c37b675

       pkg> add git@github.com:JuliaLang/Example.jl.git

       pkg> add Example=7876af07-990d-54b4-ab0e-23690620f79a

    更详细的包管理,可参考官方文档(https://docs.juliacn.com/latest/stdlib/Pkg/)。

  回过头来,我们再来看游戏开发库GameZero。它的代码托管在GitHub网站上,网址是:https://github.com/aviks/GameZero.jl,从这个网站我们可以看到,它的最后发布版本是2021年发布的0.2.1,可见还不是一个成熟的发布。而且,源码也已经有了更新。所以,为了获得最新的功能,我们采用URL安装的方式来安装这个库。见下图:

    另外,该游戏库还依赖Colors库,所以需要安装Colors库:pkg> add Colors

  1. 游戏目录

  每个游戏及其资产都存储在一个单独的目录中。在这个目录中,有一个.jl文件,用于存储游戏代码。此外,还有三个用于存储声音、图像和音乐的子文件夹。为什么声音(sound)和音乐(music)要分作两个文件夹,后面自有分晓。

1.3.    永远的Hello Wold

  在程序员中有一种惯例。当学习一种新技术时,通常会编写一个基于这种新技术的hello, world 程序。 这既可以检验开发环境是否能够正常工作,也是向迈入的新世界发出一声问候。

  以下示例程序是一个GameZero版的hello,world程序。

txt = TextActor("Hello World","chiller",font_size=24, col-or=Int[0,0,0,255])#
txt.pos = (0,0)

function draw(g::Game)
   clear()
   draw(txt)    
end

在解释这段代码之前,让我们先看看Python游戏库Pyglet版的hello,world程序:

import pyglet
game_win = pyglet.window.Window()
label = pyglet.text.Label('hello, world', x=0, y=0)

@game_win.event
def on_draw():
    game_win.clear()
    label.draw()
pyglet.app.run()

  我们先看最后一行,Pyglet通过调用 pyglet.app.run ()方法,让游戏运行起来,这时程序进人 Pyglet 的默认事件循环,Pyglet 响应各种事件。但是GameZero版的程序却没有类似的代码,那游戏是怎么运行起来的呢?

  在GameZero的模式里,游戏代码文件*.jl是不能直接在Julia环境中运行的,需要用下面的方式:

  打开Julia REPL或者在终端中进入Julia环境,然后输入:

julia> using GameZero

julia> rungame("C:\\path\\to\\game\\Spaceship\\Spaceship.jl")

  从上面代码可以看出,GameZero版本的游戏,需要通过GameZero提供的rungame函数运行指定目录下的游戏代码文件,该函数会读取游戏代码文件的文本,并执行文本中符合GameZero预定规则的函数或语句。

  再来看Pyglet版的第三行,使用 piglet.text.Label 类创建一个文本标签对象 label。 在创建这个文本标签对象时,第 1 个参数设定标签上显示的内容为 hello, world。后两个参数指定这个文本标签显示在窗口的坐标位置为(0,0)。而GameZero版使用TextActor函数(注意Julia没有类的概念)创建了一个文本角色对象txt,在创建这个文本角色对象时,第 1 个参数设定对象上显示的内容为 hello, world。后面的参数分别是字体名称、文字大小、文字颜色,需要说明的是,GameZero无法默认使用系统字体,字体文件必须存放于游戏文件同级的“fonts”目录下。文本角色对象的位置,通过pos属性指定。

  将文字显示到窗口上的方法,Pyglet与GameZero极为类似。Pyglet是on_draw()函数,通过使用一个装饰器@game_win.event 将其后定义的方法(on_draw())关联到窗口对象 game_win。而GameZero是draw()函数,当rungame()函数读取到draw()函数时,会将此函数自动关联到内置的窗口对象上,当重新绘制窗口时,GameZero将响应并分派此事件,在 draw()方法中的代码就会被执行。 简单地说就是,如果想要在窗口中显示文本、图片等内容,那么就在 draw()方法中编写相关代码。

  另外,Pyglet与GameZero都采用clear()函数来清屏,接着用draw()函数显示对象,只是写法上略有不同

    我们最后看一下hello,world程序运行效果:

posted on 2022-06-19 14:23  语风  阅读(65)  评论(0编辑  收藏  举报