Python腳本解決在游戲開發(fā)中的困難
Python腳本是一種廣泛應(yīng)用于玩游戲開發(fā)的通信語言,在實際應(yīng)用的過程中還是有不少的問題困擾著開發(fā)人員,下面是Python腳本在實際應(yīng)用中的具體問題解決方案。希望讀完下面的文章對其有所幫助。
在早期的一些游戲中,大部分的游戲邏輯都直接寫入游戲代碼,例如計算公式、游戲流程等。但隨著游戲產(chǎn)業(yè)的不斷發(fā)展,游戲開發(fā)本身也變得越來越復(fù)雜,游戲企劃需要更多的時間來對游戲進(jìn)行調(diào)整,如果游戲邏輯還寫在代碼中,則企劃對游戲的每次修改都要通過程序進(jìn)行,而且還需要重新編譯以及重啟程序,這樣工作效率就大大降低了。#t#
在游戲中使用Python腳本,就正好能解決上述問題,小到一些計算公式,大到游戲的控制流程都可以通過Python腳本完成,而且目前的腳本系統(tǒng)大多是解釋執(zhí)行的,因此都可以支持運行時動態(tài)修改,這樣一來可以立即看到修改結(jié)果,非常方便。
如何使用腳本
腳本主要有兩種方式。一種方式是主程序使用一門高級語言,比如C++進(jìn)行編寫,然后對其嵌入一個腳本解釋器,在運行時動態(tài)執(zhí)行一些腳本函數(shù);另一種方式則是整個程序全部使用腳本編寫,例如一些泥巴游戲就是直接用LPC腳本編寫的。
本文主要研究嵌入式Python腳本使用方法,因為目前大部分的腳本都不能提供如VC++那樣方便的調(diào)試環(huán)境,如果程序全部用腳本編寫,當(dāng)腳本多達(dá)幾萬行甚至十幾萬行的時候,調(diào)試會成為一件非常痛苦的事。而且嵌入式使用時可以將一些非常耗時的代碼用C++編寫,以保持較好的運行效率。
序從C++的main( )函數(shù)開始啟動,然后進(jìn)入主循環(huán),在一些C++函數(shù)中會直接調(diào)用腳本函數(shù),在腳本函數(shù)的運行過程中,又可能調(diào)用C++的擴(kuò)展函數(shù)。C++擴(kuò)展函數(shù)的主要功能有兩個:一是用來增加Python腳本無法直接編寫的功能,二是用來替換腳本中運行速度過慢的函數(shù)。
上述過程的關(guān)鍵點就在于C++和腳本如何相互調(diào)用函數(shù),以及如何傳遞參數(shù)與結(jié)果。一般的解決方法是在程序啟動時利用腳本的API向腳本注冊C++的擴(kuò)展函數(shù),將函數(shù)指針傳遞給腳本系統(tǒng)以便將來調(diào)用,調(diào)用腳本函數(shù)則使用腳本系統(tǒng)的API將調(diào)用參數(shù)壓進(jìn)棧,取得運行結(jié)果也要通過API進(jìn)行。
Python 腳本簡介
目前有許多第三方腳本語言可供直接使用,例如Tcl、Lua等等,本文要介紹的是Python腳本。Python已經(jīng)有超過十年的歷史,是一種解釋性的、面向?qū)ο蟮哪_本語言。Python的解釋器在大部分的操作系統(tǒng)上都可以運行,如Windows、Linux、Solaris、Mac 等。
1. 安裝與配置
安裝完成后在開始菜單中會有Python的圖形化編輯器(IDLE,但目前版本不支持中文字符),Python的命令行解釋器以及用戶手冊
為了在C++程序中調(diào)用Python的API函數(shù),需要將頭文件與lib路徑添加到VC++的搜索目錄中,頭文件路徑是本地Python安裝目錄下的include目錄,lib路徑是本地Python安裝目錄下的libs目錄。這里需要注意的是安裝包只提供了release版本的lib與dll,如果需要調(diào)試運行,則必須自己下載Python的源代碼以編譯debug版本的lib與dll.
2. 語法簡介
詳細(xì)的語法說明請參考Python安裝包自帶的文檔,這里我只介紹一些常用的關(guān)鍵字與注意事項。
Python腳本沒有C++中的 { 和 } ,它使用縮進(jìn)來代替。變量不需要單獨聲明,但不能引用未經(jīng)賦值的變量。
Python腳本中引入了模塊的概念,類似C++中Lipary的概念。模塊可以包含函數(shù)、變量、類。一個腳本文件就是一個模塊,模塊在使用前需要導(dǎo)入。
Python中沒有switch,使用if判斷代替。
- if ( num==1 ):
- print "1"
- elif ( num==2 ):
- print "2"
- else:
- print "unknown
"while 是Python的一個循環(huán)語句。在while循環(huán)內(nèi)可以使用continue跳到下個循環(huán),使用peak可以跳出整個循環(huán)
- cnt = 5
- while ( cnt > 0 ):
- print cnt
- cnt -= 1
- for 循環(huán):
- list = ["test1", "test2", "test3"]
- for str in list:
- print str
詞典是Python腳本的一種映射數(shù)據(jù)類型,它能從一個鍵值(key)映射到實際內(nèi)容(value):
- accounts = {'tom':'123456', 'mike':'654321'}
- print accounts['tom']
- print accounts['mike']
3.API 介紹
Pyhon腳本提供了大量的C API,C++與Python的交互都是通過這些API進(jìn)行。下面介紹幾個比較重要的API函數(shù):void Py_Initialize( )在使用Python系統(tǒng)前,必須使用Py_Initialize對其進(jìn)行初始化。它會載入Python的內(nèi)建模塊并添加系統(tǒng)路徑到模塊搜索路徑中。
這個函數(shù)沒有返回值,檢查系統(tǒng)是否初始化成功需要使用Py_IsInitialized。int PyRun_SimpleString(char *command)把輸入的字符串作為Python代碼直接運行,返回0表示成功,-1表示有。大多時候錯誤都是因為字符串中有語法錯誤。PyObject* Py_BuildValue(char *format, ...)把C++的變量轉(zhuǎn)換成一個Python對象。
當(dāng)需要從C++傳遞變量到Python時,就會使用這個函數(shù)。此函數(shù)有點類似C的printf,但格式不同。常用的格式有s表示字符串,i表示整型變量,f表示浮點數(shù),O表示一個Python對象。PyObject* PyObject_CallObject(PyObject*callable_object, PyObject *args)調(diào)用一個callable_object指向的Python函數(shù),args為調(diào)用參數(shù)
在使用此函數(shù)前可以用PyCallable_Check來檢測callable_object是否為一個可被調(diào)用的Python對象。PyObject* PyImport_Import(PyObject *name)載入一個n a m e 指定的模塊??梢韵仁褂肞yString_FromString將模塊名轉(zhuǎn)換為Python對象,再使用PyImport_Import載入。void Py_Finalize()關(guān)閉Python系統(tǒng),一般在程序退出時調(diào)用此函數(shù)。