江岸
摘要:傳統(tǒng)的網(wǎng)絡(luò)游戲開發(fā)采用C/C++實(shí)現(xiàn)游戲的邏輯功能,隨著游戲內(nèi)容越來越豐富以及快速變化的市場需要,C/C ++已經(jīng)不能滿足開發(fā)者對于語言靈活性、易用性、動(dòng)態(tài)編譯的需求。為此文中提出了一種基于Python的游戲腳本系統(tǒng),通過將游戲內(nèi)容與游戲引擎相分離、避免硬編碼,提高了游戲的開發(fā)效率和穩(wěn)定性。
關(guān)鍵詞:Python;網(wǎng)絡(luò)游戲;腳本;集成
中圖分類號:TP391.9 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2013)09-2109-03
1 概述
網(wǎng)絡(luò)游戲發(fā)展至今,市場競爭相當(dāng)激烈,這就促使開發(fā)者必須快速、高效的響應(yīng)玩家需求才能站得一席之地。傳統(tǒng)的游戲開發(fā)中大量使用C/C++技術(shù),雖然C/C++有著明顯的性能優(yōu)勢,但很多時(shí)候我們關(guān)心的不是程序的運(yùn)行效率,而是程序的開發(fā)效率、維護(hù)效率、可移植性等[1]。在游戲中使用Python腳本,就正好能滿足這些目標(biāo),小到一些計(jì)算公式,大到游戲的控制流程都可以通過腳本完成,且Python支持運(yùn)行時(shí)動(dòng)態(tài)修改,能做到代碼熱更新。因此,構(gòu)建基于Python的網(wǎng)絡(luò)游戲腳本系統(tǒng)是非常具有應(yīng)用價(jià)值的。
2 Python動(dòng)態(tài)腳本語言簡介
Python是一門優(yōu)雅、簡約、健壯的開源解釋性語言。它誕生于1989年,由Guido Van Rossum開發(fā)設(shè)計(jì)。Python最初源自于某個(gè)研究項(xiàng)目,為了提高工作效率而創(chuàng)造的一種通用程序設(shè)計(jì)語言。經(jīng)過十來年的發(fā)展,Python已經(jīng)逐漸完善,由于其強(qiáng)大的擴(kuò)展性和豐富的庫支持,很多領(lǐng)域都出現(xiàn)了它的身影,譬如YouTube、豆瓣等就是使用Python技術(shù)的成功案例。Python的主要特點(diǎn)有[2]:
1)進(jìn)入門檻低 Python語法相當(dāng)?shù)暮啙?,編寫出的程序通常短小精悍,且類似于自然語言,符合開發(fā)者的使用常識和直覺,再加上設(shè)計(jì)精巧的數(shù)據(jù)結(jié)構(gòu)和內(nèi)存管理,使得它成為一門容易學(xué)習(xí)的編程語言。
2)面向?qū)ο?Python中面向?qū)ο蟮膶?shí)現(xiàn)是通過使用自定義的類和對象來完成的,這種特性是在其設(shè)計(jì)之初就被賦予的。
3)內(nèi)存管理功能 Python解釋器接管了內(nèi)存管理,這使得開發(fā)人員可以更關(guān)注于程序本身邏輯的實(shí)現(xiàn),而不必像C/C++程序員那樣常常分心于內(nèi)存事務(wù)的處理。正因?yàn)槿绱?,Python開發(fā)的程序周期更短、錯(cuò)誤更少。
4)可方便地嵌入宿主語言并與其通訊 通常一些特別強(qiáng)調(diào)性能的地方,可以用C來編寫,然后在Python中調(diào)用這些擴(kuò)展模塊以達(dá)到性能提升的目的。反之C/C++中也可以嵌入Python解釋器,這樣就可以替代動(dòng)態(tài)連接庫形式的接口,使得程序開發(fā)更靈活。
5)豐富的庫 Python的標(biāo)準(zhǔn)庫包含有數(shù)百個(gè)模塊,其功能涵蓋與操作系統(tǒng)、解釋器、Internet等的交互,所有這些模塊都已經(jīng)充分測試,可以直接在開發(fā)中使用。
3 腳本系統(tǒng)架構(gòu)設(shè)計(jì)
腳本在游戲開發(fā)中扮演著粘合劑的角色,如何高效、快捷的使用和管理腳本,使之服務(wù)于游戲邏輯的開發(fā)并驅(qū)動(dòng)整個(gè)游戲進(jìn)程就是我們需要解決的問題。腳本和宿主代碼通常是以事件為中心進(jìn)行相互交互[3],具體在游戲中與腳本交互的就是我們的游戲引擎。從圖1中我們可以得知腳本系統(tǒng)的基本框架,即腳本語言本身和腳本接口模塊。腳本系統(tǒng)設(shè)計(jì)的關(guān)鍵在于接口模塊的實(shí)現(xiàn),為了提供一個(gè)通用的腳本系統(tǒng)設(shè)計(jì)方案,我們將腳本接口模塊集成到引擎中。腳本接口模塊主要作用是方便Python腳本的擴(kuò)展和嵌入,為Python腳本與游戲引擎之間提供一個(gè)數(shù)據(jù)交互的通道,從而將游戲的邏輯和具體實(shí)現(xiàn)分離開來[4]。
3.1 腳本接口模塊的總體設(shè)計(jì)
腳本接口模塊的總體設(shè)計(jì)如圖2所示,它由游戲世界接口、腳本對象管理器、腳本包裝器、邏輯腳本、消息處理器腳本幾個(gè)部分組成。其作用主要包括以下一些方面:
1)提供Python腳本能夠?qū)崿F(xiàn)游戲具體功能的接口,具體包括腳本可以創(chuàng)建游戲?qū)ο?、修改游戲中角色對象屬性、設(shè)置定時(shí)器、打印調(diào)試日志等功能,這是由游戲世界接口管理完成的。
2)便于引擎管理腳本文件,使得引擎能夠根據(jù)邏輯靈活的調(diào)用相關(guān)腳本。這是通過腳本包裝器將腳本文件由一個(gè)獨(dú)立的管理類模塊管理實(shí)現(xiàn)的,腳本包裝器由邏輯腳本對象、消息處理器對象組成。其中消息處理器對象維護(hù)著一個(gè)消息到邏輯處理的映射關(guān)系表。
3)通過修改消息處理器對象維護(hù)的映射關(guān)系表,引擎內(nèi)核可以動(dòng)態(tài)的加載、修改、刪除腳本對象,從而實(shí)現(xiàn)游戲邏輯的熱更新。
通過腳本接口模塊這個(gè)抽象層使得引擎與Python腳本可以相互交互,Python與C++的交互是建立在Python與C的基礎(chǔ)上的,主要是數(shù)據(jù)格式的轉(zhuǎn)換和對異常的處理。
3.2 Python調(diào)用引擎函數(shù)
本系統(tǒng)需要使用Python語言來實(shí)現(xiàn)引擎的邏輯部分,因此引擎必須為Python語言提供訪問內(nèi)部實(shí)體的接口,提供一個(gè)接口需要以下一些步驟:
1)引擎中創(chuàng)建具體的擴(kuò)展模塊代碼。
2)腳本接口系統(tǒng)中編寫一個(gè)單獨(dú)的C源文件,并利用樣板來包裝代碼。
① 包含Python.h頭文件,它包含了我們所需要的所有聲明。
② 為每一個(gè)函數(shù)都增加PyObject *Module_func()的包裝函數(shù),用于將Python參數(shù)轉(zhuǎn)換成C程序格式類型,處理完再轉(zhuǎn)換為Python對象傳回給Python解釋器。期間如果有錯(cuò)誤出現(xiàn),即設(shè)置模塊的異常處理對象并返回NULL。
③ 增加PyMethodDef ModuleMethods[]的數(shù)組,用于將函數(shù)名與函數(shù)實(shí)現(xiàn)聯(lián)系起來。
④ 增加模塊初始化函數(shù)initMethod()。
此外,還可以通過一些自動(dòng)化工具來完成上述過程,譬如使用SWIG工具,它是一種簡化腳本語言與C/C++接口的開發(fā)工具,通過包裝和編譯C程序達(dá)到與腳本通訊的目的[5]。
3.3 引擎調(diào)用Python函數(shù)
Python被用作實(shí)現(xiàn)引擎中的邏輯和消息處理器,然后在需要的時(shí)候從C++中調(diào)用腳本中的函數(shù)。主要步驟如下:
1)設(shè)置編譯環(huán)境,即設(shè)置Python頭文件和庫文件目錄。
2)初始化Python解釋器,Py_Initialize()。
3)調(diào)用Python腳本邏輯,并處理異常。
4)釋放資源,Py_Finalize()。
4 應(yīng)用案例
該腳本系統(tǒng)結(jié)構(gòu)清晰,易于實(shí)現(xiàn),利用該系統(tǒng)在游戲中的尋路和城戰(zhàn)模塊中使用Python腳本來完成邏輯,如圖3所示,實(shí)踐證明使用該腳本系統(tǒng)能夠帶來較高的開發(fā)效率,且能動(dòng)態(tài)的修復(fù)線上bug,快速的響應(yīng)了玩家的需求。
5 結(jié)束語
本文設(shè)計(jì)了一種基于Python的網(wǎng)絡(luò)游戲腳本系統(tǒng),通過在腳本接口模塊中提供腳本調(diào)用的引擎接口,使得利用腳本就可以完成游戲邏輯,有效地降低開發(fā)的復(fù)雜性,此外,游戲邏輯和引擎的分離提高了系統(tǒng)的穩(wěn)定性,在實(shí)際項(xiàng)目中使用該腳本系統(tǒng)取得了較好的市場效果。
參考文獻(xiàn):
[1] 于造波.腳本技術(shù)在游戲引擎中的應(yīng)用[J].電腦知識與技術(shù),2008(19) :167-169.
[2] 王國強(qiáng),張貝克.基于Python的嵌入式腳本研究[J].計(jì)算機(jī)應(yīng)用與軟件,2010,27(3):107-109.
[3] 王娟玲.網(wǎng)絡(luò)游戲引擎技術(shù)的研究[J].電腦編程技巧與維護(hù),2011(10):64-65.
[4] Diego Garces.腳本語言總述游戲編程精粹6[M].北京:人民郵電出版社,2012.
[5] 羅霄,任勇,山秀明.基于Python的混合語言編程及其實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2004(12).