王逸勉+翟軍
摘要:電腦以及手機(jī)上的單機(jī)游戲已經(jīng)成為中國(guó)年輕人近年來(lái)消遣娛樂的重要途徑之一,選擇一個(gè)高效率、多平臺(tái)、易使用的游戲引擎是絕大多數(shù)游戲開發(fā)商要面臨的首要難題。該文通過(guò)案例,給出利用多平臺(tái)游戲引擎RenPy將游戲從設(shè)計(jì)、制作、到發(fā)布的一套相對(duì)完整的方案,以此為游戲開發(fā)者提供參考。
關(guān)鍵詞: 游戲開發(fā);安卓;跨平臺(tái);RenPy;游戲引擎
中圖分類號(hào):TP319 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)10-0224-03
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 RenPy game engine,to provide reference for game developers.
Key words: game development; android; multiple-platform; RenPy; game engine
電子游戲作為一種文化和產(chǎn)業(yè),并非是在2011年美國(guó)國(guó)家藝術(shù)基金會(huì)宣布其第九藝術(shù)的身份之后才被人們熟知,早在本世紀(jì)初,全球游戲產(chǎn)業(yè)產(chǎn)值就已達(dá)到94億美元,超越了電影工業(yè)89億美元的產(chǎn)值,電子游戲相關(guān)產(chǎn)品的推出帶動(dòng)了新的服務(wù)產(chǎn)業(yè),為社會(huì)提供了大量的就業(yè)崗位[1]。在我國(guó),文化部在2015年發(fā)布《2015年扶持成長(zhǎng)型小微文化企業(yè)工作方案》明確了動(dòng)漫、游戲產(chǎn)業(yè)等成長(zhǎng)型小微文化企業(yè)扶持成長(zhǎng)政策;此外,國(guó)務(wù)院在推廣上海自貿(mào)區(qū)經(jīng)驗(yàn)時(shí),指出“允許內(nèi)外資企業(yè)從事游戲游藝設(shè)備生產(chǎn)和銷售”,電視游戲在被政策冷凍數(shù)年之后,終于迎來(lái)解封時(shí)期。電視游戲、移動(dòng)游戲、電子競(jìng)技、視頻直播、虛擬現(xiàn)實(shí)這些將有望一起共同帶動(dòng)中國(guó)游戲產(chǎn)業(yè)的新規(guī)模增長(zhǎng)[2]。
與游戲產(chǎn)業(yè)一同迅猛發(fā)展的還有形形色色的游戲引擎,其作用是提供各種編寫游戲時(shí)所需的各種工具,協(xié)助開發(fā)者在開發(fā)游戲的過(guò)程中節(jié)約成本、縮短周期和降低風(fēng)險(xiǎn),使其無(wú)需關(guān)心底層的顯示細(xì)節(jié)?,F(xiàn)在全世界已經(jīng)有了各種比較成熟的引擎,在3D游戲方面有Unity3D、Unreal、Frostbite,在2D游戲方面則有Cocos2D、Cycclone2D、KRKR等,本文介紹的引擎則是2D游戲開發(fā)領(lǐng)域中的引擎RenPy。
1 RENPY引擎概述
RenPy是一款基于Python語(yǔ)言、擅長(zhǎng)制作文字冒險(xiǎn)游戲的2D游戲引擎,能相對(duì)減少開發(fā)者在制作這類游戲時(shí)的工作量。其具有良好的跨平臺(tái)性,使其能夠同時(shí)在Mac OSX、Linux、Windows、Android系統(tǒng)中運(yùn)行,并且其良好的開源性允許開發(fā)者自由拓展其他功能進(jìn)一步完善和豐富游戲。使用此引擎制作比較成熟的商業(yè)游戲,例如DisChan公司制作的《Junipers Knot》、ALICE IN DISSONANCE工作室開發(fā)的《fault milestone one》,前者在蘋果商城中的1270條評(píng)價(jià)中獲得了1177條五星評(píng)價(jià),后者在STEAM平臺(tái)中有著95%的好評(píng)率。在中國(guó),也有使用本引擎制作的文字冒險(xiǎn)游戲,例如Magenta Factory獨(dú)立游戲工作室制作的《山桂》,其已于2014年在STEAM平臺(tái)發(fā)行,并且獲得了用戶83%好評(píng)率的成績(jī)。
2 文字冒險(xiǎn)游戲
文字冒險(xiǎn)游戲(Text Adventure Game)是以文字輸入輸出為主的一類冒險(xiǎn)游戲,此類型游戲以軟件模擬情境,令玩家使用文字指令控制角色,以影響周邊的情境。其運(yùn)作方式可以理解成是用計(jì)算機(jī)游戲來(lái)做文學(xué)敘事。在亞洲,尤其在日本,文字游戲通常被稱為視覺小說(shuō)或交互式小說(shuō),以文字和圖片以及音效的輸出來(lái)展示游戲中的信息,玩家通過(guò)選擇與點(diǎn)擊等方式進(jìn)行輸入與游戲進(jìn)行交互,玩家借由上述方式獲得游戲體驗(yàn)。
3 游戲開發(fā)上的應(yīng)用
在完成必要的游戲設(shè)定的前提下,利用RenPy制作一個(gè)游戲的過(guò)程包括界面設(shè)計(jì)、數(shù)據(jù)初始化、定義人物、編寫劇本等,以下將給出示例擇其相對(duì)較必要的步驟進(jìn)行講解。
3.1 界面設(shè)計(jì)
游戲中的很多操作是通過(guò)游戲界面來(lái)展示和運(yùn)用的,好的游戲界面能夠幫助玩家快速上手,營(yíng)造出美觀、操作簡(jiǎn)單并且具有引導(dǎo)功能的人機(jī)環(huán)境。游戲界面包括游戲主界面、二級(jí)界面和彈出界面等[4]。
在RenPy引擎中,游戲界面主要靠Screen進(jìn)行實(shí)現(xiàn),每一個(gè)Screen都是一群UI元件在屏幕上的排列組合,其源代碼一般儲(chǔ)存在game文件夾中的screen.rpy中。
如圖2所示,圖中的代碼演示了如何通過(guò)RenPy的Screen實(shí)現(xiàn)一個(gè)簡(jiǎn)單的游戲提示功能。首先代碼定義了一個(gè)字體的樣式和兩個(gè)動(dòng)畫變化語(yǔ)言(ATL),兩個(gè)變換語(yǔ)言寫入提示框的出現(xiàn)和消失的位置與時(shí)間從而控制其變化軌跡。而Screen Tips則需在調(diào)用時(shí)接受兩個(gè)變量,TipsName是顯示在提示框中的文字,而status決定了Screen Tips是對(duì)對(duì)話框進(jìn)行顯示還是進(jìn)行隱藏。在實(shí)際劇本編寫中,則可以用以下的一行代碼來(lái)調(diào)用這個(gè)Screen:
show screen Tips("增加新人物說(shuō)明","show")
開發(fā)者可以通過(guò)豐富的UI命令對(duì)Screen進(jìn)行操作,并且可以在官方文檔里[10]查詢到完整的UI命令列表。
3.2 對(duì)話及控制流
在書寫人物對(duì)話之前,開發(fā)者需要新建一個(gè)角色對(duì)象,以便簡(jiǎn)化隨后的劇本編寫。以這段人物定義代碼為例:
define DMF = Character('端木斐', color="#FFFFFF",image="duanmu",voice_tag="duanmu",what_prefix="“",what_suffix="”")
代碼定義了一個(gè)名為端木斐的人物,縮寫是DMF,在隨后的對(duì)話中僅需要使用DMF便可以被程序識(shí)別。color決定了人物名稱的顏色,它應(yīng)該傳入以RGB色彩模式表示的字符串。image指定與該角色對(duì)象關(guān)聯(lián)的圖像標(biāo)記的字符串。voice_tag將允許在設(shè)置界面調(diào)整該角色的語(yǔ)音音量,what_prefix與what_suffix分別決定了添加到對(duì)話內(nèi)容之前和之后的內(nèi)容。
在書寫對(duì)話時(shí),以前面定義的角色為例,只要在腳本中以如下格式書寫即可:
DMF smile “ 你好,我叫端木斐。”
在游戲劇本中,可以使用標(biāo)簽與控制流靈活改變劇情的走向。label命令可以給腳本的某個(gè)位置起一個(gè)名稱,它們是配合jump或者call命令使用的。jump命令與C語(yǔ)言中的goto語(yǔ)句類似,它用于將腳本執(zhí)行器跳轉(zhuǎn)到指定的標(biāo)簽。call命令與jump類似,只不過(guò)它會(huì)將下一個(gè)命令壓入call棧中,在被調(diào)用的標(biāo)簽結(jié)束后可以返回call命令被執(zhí)行的地方。return命令將會(huì)返回調(diào)用call命令的標(biāo)簽中,如果call棧為空,程序則會(huì)重啟。
3.3 圖像
在游戲劇本中使用如下命令就可以控制游戲中圖片的顯示與隱藏:
image - 定義一個(gè)新的圖像
show - 在某個(gè)圖層上輸出圖像
scene - 清空一個(gè)圖層上的全部圖像,隨即在上面顯示一個(gè)圖像
hide - 將某個(gè)圖像從圖層中隱藏
在列表(list) config.automatic_image_strip中定義一整個(gè)文件夾的圖像,在腳本中就可以直接使用文件名進(jìn)行調(diào)用,例如代碼:
config.automatic_images_strip = [ 'images' ,'char','bg']
就可以自動(dòng)將游戲庫(kù)下images、char、bg文件夾中的圖像自動(dòng)定義,避免單個(gè)文件定義的繁瑣步驟。假如不用自動(dòng)定義命令,則需要以如下的命令格式來(lái)定義圖片:
image school night = “images/bg/school_night.png”
在游戲腳本中,則用以下代碼使屏幕顯示上述定義圖像:
scene image school night
RenPy引擎中,不僅是圖片文件可以被定義為image,它還可以接收如下的賦值類型:
圖像文件
RGB色彩表達(dá)模式的字符串
ARGB色彩表達(dá)模式的元祖
用Displayable函數(shù)產(chǎn)生的圖像,例如DynamicDisplayable()
為了使圖片動(dòng)態(tài)改變,通常使用DynamicDisplayable()函數(shù),它接收一個(gè)Python格式的函數(shù),每隔一段時(shí)間就執(zhí)行一次,并且用該函數(shù)返回的Displayable決定顯示內(nèi)容。其他的動(dòng)態(tài)顯示函數(shù)還有ConditionSwitch和ShowingSwitch。
3.4 聲音
在播放音頻之前需要在RenPy提前注冊(cè)音頻頻道,引擎預(yù)定義了music、sound、voice三個(gè)頻道分別用來(lái)播放音樂、音效和語(yǔ)音,其一大區(qū)別就是音樂頻道中的聲音文件會(huì)循環(huán)播放,而sound和voice只會(huì)播放一次,分頻道的好處之一是避免不同類型聲音在播放時(shí)產(chǎn)生沖突。在腳本編寫中,通常使用play命令調(diào)用聲音,例如:
play music “mozart.ogg” fadein 0.5
paly后接頻道名,其后則是開發(fā)者欲播放的文件名,如果給出一個(gè)文件列表,則會(huì)按照順序進(jìn)行播放,fadein是可選參數(shù),它可以音頻文件的淡入時(shí)間。在腳本編寫中,通常使用stop命令停止頻道中聲音的播放,例如:
stop music “mozart.ogg” fadeout 0.5
本行代碼將music頻道中的mozart.ogg停止播放,并且淡出時(shí)間是0.5秒。
在一些游戲中,當(dāng)角色語(yǔ)音處于播放狀態(tài)時(shí),角色立繪的嘴巴則會(huì)隨著語(yǔ)音動(dòng)作,例如5pb公司開發(fā)的《Steins;Gate》,為了在RenPy實(shí)現(xiàn)此功能要用到DynamicDisplayable()函數(shù),如圖3所示,用renpy.music.is_playing(channel)函數(shù)確認(rèn)所給頻道是否有語(yǔ)音正在播放,用_get_voice_info().tag函數(shù)確認(rèn)正在播放時(shí)的人物標(biāo)簽,當(dāng)滿足條件時(shí)則顯示嘴部動(dòng)作,否則不顯示,如果在這里利用語(yǔ)音識(shí)別技術(shù)則可以做到人物嘴型與對(duì)話內(nèi)容的一致,達(dá)到與《Steins;Gate》中相同的效果。
3.5 生成分發(fā)版
用RenPy游戲制作的最后一步是生成游戲的分發(fā)版以讓全世界的人玩到游戲,并且將游戲中用到的素材以及代碼打包加密。要完成這個(gè),只要點(diǎn)選Laucher中的生成分發(fā)版即可,但在那之前還需要在option.rpy中對(duì)游戲進(jìn)行最后的設(shè)置。布爾型變量config.developer一般都要在正式發(fā)布之前設(shè)為False以避免用戶使用開發(fā)者工具進(jìn)行作弊。config.window_title則決定了當(dāng)項(xiàng)目以窗口化運(yùn)行時(shí)的標(biāo)題名稱。build.directory_name用于修改發(fā)行版壓縮包與文件夾的名稱,一般在名稱中要添加后綴版本號(hào)。build.executable_name則決定了可執(zhí)行程序的文件名。為了將資源進(jìn)行封包,則需要先使用build.archive()函數(shù)定義資源封包的名稱,用build.classify()定義需要放進(jìn)封包的游戲資源文件列表。
4 結(jié)束語(yǔ)
RenPy引擎在文字冒險(xiǎn)游戲開發(fā)方面有著先天優(yōu)勢(shì),然而又因?yàn)槠鋬?yōu)良的可擴(kuò)展性,又給予了其制作其他游戲諸如角色扮演類游戲、戰(zhàn)旗類游戲、解謎游戲的可能性,并且目前已有先例可供參考,在導(dǎo)入socket以及threading等模塊后甚至可以實(shí)現(xiàn)主機(jī)之間通過(guò)網(wǎng)絡(luò)的互聯(lián),這又為其游戲方式拓展了數(shù)量可觀的可能性。相信在中國(guó)游戲產(chǎn)業(yè)迎來(lái)發(fā)展的當(dāng)下,RenPy引擎將會(huì)成為開發(fā)者們又一大助力。
參考文獻(xiàn):
[1] 谷清勇. 電子游戲產(chǎn)業(yè):新經(jīng)濟(jì)增長(zhǎng)點(diǎn)[J]. 中國(guó)經(jīng)濟(jì)周刊, 2004(11):29-30.
[2] 騰訊游戲. 2015-2016中國(guó)泛娛樂產(chǎn)業(yè)發(fā)展白皮書[EB/OL]. http://games.qq.com/a/20160307/052889.htm.
[3] 金鑫. 游戲引擎在游戲開發(fā)中的應(yīng)用[J]. 電腦知識(shí)與技術(shù), 2007(19).
[4] Art Eyes設(shè)計(jì)工作室. 創(chuàng)意UI Photo玩轉(zhuǎn)游戲界面設(shè)計(jì)[M]. 北京:人民郵電出版社, 2015:8.
[5] Jesse Schell. 全景探秘 游戲設(shè)計(jì)藝術(shù)[M]. 北京:電子工業(yè)出版社, 2010 .
[6] Tom Rothamel. Ren'Py Documentation[EB/OL]. https://www.renpy.org/doc/html/.