PDF:Ren_Py引擎在文字冒险游戏开发上的应用_王逸勉
Ren_Py引擎在文字冒险游戏开发上的应用_王逸勉多媒体技术及其应用 本栏目责任编辑:唐一东Computer Knowledge and Technology 电脑知识与技术第12 卷第10 期(2016 年4 月)Ren'Py 引擎在文字冒险游戏开发上的应用王逸勉,翟军(大连海事大学交通管理运输学院,辽宁大连116026)摘要:电脑以及手机上的单机游戏已经成为中国年轻人近年来消遣娱乐的重要途径之一,选择一个高效率、多平台、易使用的游戏引擎是绝大多数游戏开发商要面临的首要难题。该文通过案例,给出利用多平台游戏引擎Ren’Py 将游戏从设计、制作、到发布的一套相对完整的方案,以此为游戏开发者提供参考。
关键词:游戏开发;安卓;跨平台;Ren’Py;游戏引擎中图分类号:TP319 文献标识码:A 文章编号:1009-3044(2016)10-0224-03Practice of Game Designing and Development Using Ren’Py Engine WANG Yi-mian,ZHAI Jun(Transportation and Management College, Dalian Maritime University, Dalian 116026, China)Abstract: Nowadays,the single-player games on computer and mobile phone have become one of the entertainment way for most of the young people in China.Choosing a high efficiency,multiple-platform and easy to use game engine become the primary issue that most game developers have to face.Given in this paper,through a case,is a relatively complete solution from game designing to game development and release using Ren’Py game engine,to provide reference for game developers.
Key words: game development; android; multiple-platform; Ren’Py; game engine电子游戏作为一种文化和产业,并非是在2011年美国国家艺术基金会宣布其第九艺术的身份之后才被人们熟知,早在本世纪初,全球游戏产业产值就已达到94亿美元,超越了电影工业89亿美元的产值,电子游戏相关产品的推出带动了新的服务产业,为社会提供了大量的就业岗位[1]。在我国,文化部在2015年发布《2015年扶持成长型小微文化企业工作方案》明确了动漫、游戏产业等成长型小微文化企业扶持成长政策;此外,国务院在推广上海自贸区经验时,指出“允许内外资企业从事游戏游艺设备生产和销售”,电视游戏在被政策冷冻数年之后,终于迎来解封时期。电视游戏、移动游戏、电子竞技、视频直播、虚拟现实这些将有望一起共同带动中国游戏产业的新规模增长[2]。
与游戏产业一同迅猛发展的还有形形色色的游戏引擎,其作用是提供各种编写游戏时所需的各种工具,协助开发者在开发游戏的过程中节约成本、缩短周期和降低风险,使其无需关心底层的显示细节。现在全世界已经有了各种比较成熟的引擎,在3D游戏方面有Unity3D、Unreal、Frostbite,在2D游戏方面则有Cocos2D、Cycclone2D、KRKR等,本文介绍的引擎则是2D游戏开发领域中的引擎Ren’Py。
1 REN’PY 引擎概述Ren’Py是一款基于Python语言、擅长制作文字冒险游戏的2D 游戏引擎,能相对减少开发者在制作这类游戏时的工作量。其具有良好的跨平台性,使其能够同时在Mac OSX、Linux、Windows、Android系统中运行,并且其良好的开源性允许开发者自由拓展其他功能进一步完善和丰富游戏。使用此引擎制作比较成熟的商业游戏,例如DisChan 公司制作的《Juniper’s Knot》、ALICE IN DISSONANCE 工作室开发的《fault milestone one》,前者在苹果商城中的1270条评价中获得了1177条五星评价,后者在STEAM平台中有着95%的好评率。在中国,也有使用本引擎制作的文字冒险游戏,例如Magenta Factory独立游戏工作室制作的《山桂》,其已于2014年在STEAM平台发行,并且获得了用户83%好评率的成绩。
2 文字冒险游戏文字冒险游戏(Text Adventure Game)是以文字输入输出为主的一类冒险游戏,此类型游戏以软件模拟情境,令玩家使用文字指令控制角色,以影响周边的情境。其运作方式可以理解成是用计算机游戏来做文学叙事。在亚洲,尤其在日本,文字游戏通常被称为视觉小说或交互式小说,以文字和图片以及音效的输出来展示游戏中的信息,玩家通过选择与点击等方式进行输入与游戏进行交互,玩家借由上述方式获得游戏体验。
3 游戏开发上的应用在完成必要的游戏设定的前提下,利用Ren’Py制作一个游戏的过程包括界面设计、数据初始化、定义人物、编写剧本收稿日期:2016-03-25E-mail: eduf@dnzs.net.cn http://www.dnzs.net.cn Tel:+86-551-65690963 65690964ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.12, No.10, April 2016224DOI:10.14004/j.cnki.ckt.2016.1099本栏目责任编辑:唐一东 多媒体技术及其应用第12卷第10期 (2016年4月) Computer Knowledge and Technology电脑知识与技术等,以下将给出示例择其相对较必要的步骤进行讲解。
3.1 界面设计游戏中的很多操作是通过游戏界面来展示和运用的,好的游戏界面能够帮助玩家快速上手,营造出美观、操作简单并且具有引导功能的人机环境。游戏界面包括游戏主界面、二级界面和弹出界面等[4]。
图1 示例游戏的屏幕流程图在Ren’Py引擎中,游戏界面主要靠Screen进行实现,每一个Screen都是一群UI元件在屏幕上的排列组合,其源代码一般储存在game文件夹中的screen.rpy中。
图2 示例游戏的Tips 界面源代码如图2 所示,图中的代码演示了如何通过Ren’Py 的Screen实现一个简单的游戏提示功能。首先代码定义了一个字体的样式和两个动画变化语言(ATL),两个变换语言写入提示框的出现和消失的位置与时间从而控制其变化轨迹。而Screen Tips则需在调用时接受两个变量,TipsName是显示在提示框中的文字,而status决定了Screen Tips是对对话框进行显示还是进行隐藏。在实际剧本编写中,则可以用以下的一行代码来调用这个Screen:show screen Tips("增加新人物说明","show")开发者可以通过丰富的UI命令对Screen进行操作,并且可以在官方文档里[10]查询到完整的UI命令列表。
3.2 对话及控制流在书写人物对话之前,开发者需要新建一个角色对象,以便简化随后的剧本编写。以这段人物定义代码为例:define DMF = Character('端木斐', color="#FFFFFF",image="duanmu",voice_tag="duanmu",what_prefix=" “",what_suffix="”")代码定义了一个名为端木斐的人物,缩写是DMF,在随后的对话中仅需要使用DMF便可以被程序识别。color决定了人物名称的颜色,它应该传入以RGB 色彩模式表示的字符串。
image指定与该角色对象关联的图像标记的字符串。voice_tag将允许在设置界面调整该角色的语音音量,what_prefix 与what_suffix分别决定了添加到对话内容之前和之后的内容。
在书写对话时,以前面定义的角色为例,只要在脚本中以如下格式书写即可:DMF smile“ 你好,我叫端木斐。”在游戏剧本中,可以使用标签与控制流灵活改变剧情的走向。label命令可以给脚本的某个位置起一个名称,它们是配合jump或者call命令使用的。jump命令与C语言中的goto语句类似,它用于将脚本执行器跳转到指定的标签。call命令与jump类似,只不过它会将下一个命令压入call栈中,在被调用的标签结束后可以返回call命令被执行的地方。return命令将会返回调用call命令的标签中,如果call栈为空,程序则会重启。
3.3 图像在游戏剧本中使用如下命令就可以控制游戏中图片的显示与隐藏:image - 定义一个新的图像show - 在某个图层上输出图像scene - 清空一个图层上的全部图像,随即在上面显示一个图像hide - 将某个图像从图层中隐藏在列表(list) config.automatic_image_strip 中定义一整个文件夹的图像,在脚本中就可以直接使用文件名进行调用,例如代码:config.automatic_images_strip = [ 'images' ,'char','bg']就可以自动将游戏库下images、char、bg文件夹中的图像自动定义,避免单个文件定义的繁琐步骤。假如不用自动定义命令,则需要以如下的命令格式来定义图片:image school night =“images/bg/school_night.png”在游戏脚本中,则用以下代码使屏幕显示上述定义图像:scene image school night Ren’Py引擎中,不仅是图片文件可以被定义为image,它还可以接收如下的赋值类型:图像文件RGB 色彩表达模式的字符串ARGB 色彩表达模式的元祖用Displayable 函数产生的图像,例如DynamicDisplay-225多媒体技术及其应用 本栏目责任编辑:唐一东Computer Knowledge and Technology 电脑知识与技术第12 卷第10 期(2016 年4 月)able()为了使图片动态改变,通常使用DynamicDisplayable()函数,它接收一个Python格式的函数,每隔一段时间就执行一次,并且用该函数返回的Displayable决定显示内容。其他的动态显示函数还有ConditionSwitch和ShowingSwitch。
3.4 声音在播放音频之前需要在Ren’Py提前注册音频频道,引擎预定义了music、sound、voice三个频道分别用来播放音乐、音效和语音,其一大区别就是音乐频道中的声音文件会循环播放,而sound和voice只会播放一次,分频道的好处之一是避免不同类型声音在播放时产生冲突。在脚本编写中,通常使用play命令调用声音,例如:play music“mozart.ogg”fadein 0.5paly后接频道名,其后则是开发者欲播放的文件名,如果给出一个文件列表,则会按照顺序进行播放,fadein是可选参数,它可以音频文件的淡入时间。在脚本编写中,通常使用stop命令停止频道中声音的播放,例如:stop music“mozart.ogg”fadeout 0.5本行代码将music频道中的mozart.ogg停止播放,并且淡出时间是0.5秒。
图3 示例游戏中人物说话解决办法在一些游戏中,当角色语音处于播放状态时,角色立绘的嘴巴则会随着语音动作,例如5pb公司开发的《Steins;Gate》,为了在Ren’Py实现此功能要用到DynamicDisplayable()函数,如图3所示,用renpy.music.is_playing(channel)函数确认所给频道是否有语音正在播放,用_get_voice_info().tag 函数确认正在播放时的人物标签,当满足条件时则显示嘴部动作,否则不显示,如果在这里利用语音识别技术则可以做到人物嘴型与对话内容的一致,达到与《Steins;Gate》中相同的效果。
3.5 生成分发版用Ren’Py游戏制作的最后一步是生成游戏的分发版以让全世界的人玩到游戏,并且将游戏中用到的素材以及代码打包加密。要完成这个,只要点选Laucher中的生成分发版即可,但在那之前还需要在option.rpy中对游戏进行最后的设置。布尔型变量config.developer一般都要在正式发布之前设为False以避免用户使用开发者工具进行作弊。config.window_title 则决定了当项目以窗口化运行时的标题名称。build.directory_name用于修改发行版压缩包与文件夹的名称,一般在名称中要添加后缀版本号。build.executable_name则决定了可执行程序的文件名。为了将资源进行封包,则需要先使用build.archive()函数定义资源封包的名称,用build.classify()定义需要放进封包的游戏资源文件列表。
4 结束语Ren’Py引擎在文字冒险游戏开发方面有着先天优势,然而又因为其优良的可扩展性,又给予了其制作其他游戏诸如角色扮演类游戏、战旗类游戏、解谜游戏的可能性,并且目前已有先例可供参考,在导入socket以及threading等模块后甚至可以实现主机之间通过网络的互联,这又为其游戏方式拓展了数量可观的可能性。相信在中国游戏产业迎来发展的当下,Ren’Py引擎将会成为开发者们又一大助力。
参考文献:[1] 谷清勇. 电子游戏产业:新经济增长点[J]. 中国经济周刊,2004(11):29-30.[2] 腾讯游戏. 2015-2016中国泛娱乐产业发展白皮书[EB/OL].http://games.qq.com/a/20160307/052889.htm.[3] 金鑫. 游戏引擎在游戏开发中的应用[J]. 电脑知识与技术,2007(19).[4] Art Eyes设计工作室. 创意UI Photo玩转游戏界面设计[M].北京:人民邮电出版社, 2015:8.[5] Jesse Schell. 全景探秘游戏设计艺术[M]. 北京:电子工业出版社, 2010 .[6] Tom Rothamel. Ren'Py Documentation[EB/OL]. https://www.
renpy.org/doc/html/.226