草庐IT

对比python学julia(第三章:游戏编程)--(第一节)初识游戏库(1)

迟来的博客 2023-03-28 原文

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程序运行效果:

有关对比python学julia(第三章:游戏编程)--(第一节)初识游戏库(1)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  10. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

随机推荐