源碼下載地址:http://code.google.com/p/loon-simple/downloads/list
根據(jù)wikipedia的解釋:腳本語(yǔ)言(Script language,scripting language,scripting programming language),是為了縮短傳統(tǒng)的編寫-編譯-鏈接-運(yùn)行(edit-compile-link-run)過(guò)程而創(chuàng)建的計(jì)算機(jī)編程語(yǔ)言。此命名起源于一個(gè)腳本“screenplay”,每次運(yùn)行都會(huì)使對(duì)話框逐字重復(fù)。早期的腳本語(yǔ)言經(jīng)常被稱為批次處理語(yǔ)言或工作控制語(yǔ)言。一個(gè)腳本通常是解釋運(yùn)行而非編譯。腳本語(yǔ)言通常都有簡(jiǎn)單、易學(xué)、易用的特性,目的就是希望能讓程序設(shè)計(jì)師快速完成程序的編寫工作。
對(duì)于腳本語(yǔ)言,想必我們這些Java程序員都再熟悉不過(guò),因?yàn)槲覀兠刻於荚谑褂玫腏ava,從嚴(yán)格意義上講也是一種解釋型語(yǔ)言——畢竟class是憑借JVM進(jìn)行字節(jié)碼解釋才得以執(zhí)行,故而長(zhǎng)期被排斥于編譯型語(yǔ)言的門檻之外(但是,由于Java有編譯過(guò)程,若CPU支持字節(jié)碼那么class就可以脫離JVM限制,說(shuō)Java是純粹的解釋型語(yǔ)言似乎也很不妥+︿+……期待java cpu普及中……)。
在這個(gè)講解AVG游戲開發(fā)的系列博文中,為什么會(huì)提到腳本引擎的制作及應(yīng)用呢?筆者將在下面加以說(shuō)明。
在游戲開發(fā)中,我們將無(wú)可避免的遇到很多重復(fù)性工作,比如角色A-Z的創(chuàng)建,物品0-n的編輯,對(duì)話x->+∞的添加等等——這些并不是需要復(fù)雜的編碼,甚至僅是單純的數(shù)據(jù)錄入,但由于數(shù)據(jù)量龐大,通常也會(huì)耗費(fèi)相當(dāng)?shù)臅r(shí)間進(jìn)行設(shè)定。
如果讓您來(lái)做,要怎么辦呢?以最直觀的方式來(lái)說(shuō),可能有些人會(huì)考慮硬編碼,直接編碼似乎能省去很多的麻煩事。
OK,或許我們完全可以采過(guò)硬編碼方式解決問(wèn)題,比如建立一個(gè)對(duì)應(yīng)物品的class,而后為其添加各種對(duì)應(yīng)字段。
那么,假設(shè)現(xiàn)在我們?cè)谀硞€(gè)同人游戲的開發(fā)中這樣干了,并且將游戲?qū)ν獍l(fā)布。三天后,問(wèn)題來(lái)了,有人反映某物品——我虛構(gòu)個(gè)名字,就叫[對(duì)抗網(wǎng)癮專用電棍]吧。有人反映它殺傷力太低,且對(duì)[網(wǎng)癮]狀態(tài)無(wú)傷害加成……嗯,我們考慮后認(rèn)為有道理,怎么辦呢?一個(gè)字——改,反正就是一兩行代碼的事情,重新編譯,打包,發(fā)布——簡(jiǎn)單簡(jiǎn)單。
這下高枕無(wú)憂了吧?可惜,出乎我們意料之外的事情又再次發(fā)生,又過(guò)了兩天,有玩家反映我們的最終BOSS[真.紅色有角.磚家叫獸地獄鬼畜模式]的大招[終極網(wǎng)癮擴(kuò)散]會(huì)將所有我方角色全體[網(wǎng)癮化],并且會(huì)持續(xù)投擲[對(duì)抗網(wǎng)癮專用電棍]攻擊我方角色,由于改版后的[對(duì)抗網(wǎng)癮專用電棍]攻擊力太強(qiáng),并對(duì)[網(wǎng)癮]狀態(tài)有極強(qiáng)的傷害加成,我方角色很容易便會(huì)被BOSS團(tuán)滅。
你問(wèn)我這下怎么辦?硬編碼的還有什么新鮮,只能再重新編譯……用戶就是上帝,上帝讓改就改吧……但是,盡管我們非常努力,卻總有欠缺在這個(gè)游戲中存在,如果這樣改下去,三次、四次、十次、二十次|||,次次都需要重新編譯及發(fā)布,就是再簡(jiǎn)單也受不了了(做Java還好,搞C/C++的很多人都經(jīng)歷過(guò)守夜等編譯結(jié)果吧……),恐怕最終此游戲只好停止發(fā)布,爛尾了事。如果你將每個(gè)物品都直接編碼到游戲當(dāng)中,那么毫無(wú)疑問(wèn)你將會(huì)陷入到噩夢(mèng)一般的處境。
為什么我們不能選擇更加簡(jiǎn)單的方式來(lái)處理呢?既然每次重新編譯、重新發(fā)布程序那么麻煩,干什么不將配置放在游戲外面呢?實(shí)際上,我們完全可以創(chuàng)建一個(gè)文本文件記錄下所有物品參數(shù),而每次更新時(shí),我們僅需修改此文本文件便可以改變整個(gè)游戲中的屬性設(shè)置,再也不必事無(wú)巨細(xì)都重新編譯、重新發(fā)布整個(gè)游戲了。
事實(shí)上,筆者之所以耗費(fèi)筆墨寫這么一個(gè)例子,無(wú)非是為了說(shuō)明腳本應(yīng)用背后的基本準(zhǔn)則——簡(jiǎn)化軟件制作流程,避免硬編碼。
腳本可以使你真正在游戲引擎之外編寫代碼,然后再將這些代碼加載到游戲引擎之中并對(duì)它加以執(zhí)行。一般情況下,腳本是按照它們自己的語(yǔ)言格式進(jìn)行編寫的,使用何種語(yǔ)法完全由腳本引擎決定,腳本就好像是運(yùn)行在游戲程序內(nèi)部的小程序,它們的工作原理和其他的普通程序一樣,你可以使用一個(gè)普通的文本編輯器來(lái)編寫它們,然后在你的主程序中執(zhí)行它們。腳本通常使用它們自己的編譯器或者解釋器,它們對(duì)游戲主引擎并沒有任何影響——除非你希望它這么做。
同時(shí),游戲和腳本之間通常是分離的。你可以像加載圖形、聲音,甚至早期的物體描述文件一樣加載腳本。但是,你并不能在顯示器上將它們顯示出來(lái)或者是通過(guò)喇叭把它們播放出來(lái),取而代之的是,你可以執(zhí)行它們,它們也可以和你的游戲進(jìn)行通信,而游戲也可以作出應(yīng)答。
簡(jiǎn)單的說(shuō),如果我們將游戲引擎和游戲數(shù)據(jù)理解為人與積木,那么腳本就是用來(lái)搭建積木的圖樣;如果我們將游戲引擎和游戲數(shù)據(jù)理解為海洋與大陸,那么腳本就是通行在海洋與大陸間傳遞資源的貨輪。
游戲腳本是游戲引擎不可或缺的最佳搭檔。
可能您會(huì)問(wèn),既然腳本有這么多的好處,想必制作起來(lái)很麻煩吧?
關(guān)于這點(diǎn),需要從不同的角度來(lái)加以考慮。如果我們以groovy、ruby、python、lua、angelscript這些已經(jīng)成熟或接近成熟的腳本語(yǔ)言為標(biāo)準(zhǔn)來(lái)看,那么開發(fā)一種腳本語(yǔ)言的確是件很復(fù)雜的事情,涉及到易用性、執(zhí)行效率、安全性、資源回收、并發(fā)等等許多的“額外”問(wèn)題,而且既然有g(shù)roovy、ruby、python、lua、angelscript這林林種種,我們也大可不必耗費(fèi)心智來(lái)重復(fù)發(fā)明輪子。
但是,如果我們從與游戲引擎交互,減少游戲代碼量的角度出發(fā),那么自己設(shè)計(jì)的腳本與自己游戲引擎間的藕合性當(dāng)然會(huì)較第三方的腳本為高,代碼量也當(dāng)然會(huì)更少,而且維護(hù)管理也更為簡(jiǎn)便。況且交給腳本來(lái)執(zhí)行的部分,通常也不會(huì)對(duì)運(yùn)行效率有太高的要求,我們與大師的差異,也僅僅是體現(xiàn)在決定成敗的“細(xì)節(jié)”方面,單就構(gòu)建腳本解釋器本身而言,完全算不得難事,甚至簡(jiǎn)單到一兩個(gè)小時(shí)就可以搞定一個(gè)具有初步功能的腳本引擎(別說(shuō)腳本,很多80后乃至90后的程序員都開始自己寫編譯器玩了|||……)。
比如TJS(就是做吉里吉里那個(gè))及RGSS (Ruby Game Scripting System)等,都是為了更加適應(yīng)自身游戲引擎而開發(fā)出來(lái)的游戲腳本語(yǔ)言。
下面我將提供一個(gè)非常簡(jiǎn)單的腳本解釋器代碼,主要功能被集中在一個(gè)Command類中。
為了與游戲相交互,此示例構(gòu)建了一個(gè)順序執(zhí)行的動(dòng)態(tài)解釋型腳本語(yǔ)言,其中每一行實(shí)際上就是一組獨(dú)立的命令,無(wú)論分支或者輸入輸出都僅在程序讀取到本行時(shí)才會(huì)活性化, 以此保證與游戲主程序數(shù)據(jù)交互的實(shí)時(shí)性。
本例解釋的腳本start.txt內(nèi)容如下:
游戲運(yùn)行界面如下圖:





源碼下載地址:http://code.google.com/p/loon-simple/downloads/list
——————————————————————————————————————
天氣很熱,寫不出什么正經(jīng)東西,由于最近[叫獸]很猖獗,隨便做點(diǎn)東西借機(jī)踩踩它(昨天晚上寫的,因?yàn)樘珶釋?dǎo)致MV歸0,今天晚上才發(fā)出來(lái)|||)。
不過(guò)這星期六、日兩天TLOH基礎(chǔ)部分應(yīng)該也能寫完了,下周估計(jì)能發(fā)。總之是個(gè)AVG+RPG+SLG的開源游戲,劇情部分就靠發(fā)到網(wǎng)上情大家?guī)兔μ砑印搔亍桑δ芪視?huì)慢慢再補(bǔ),所有對(duì)它的意見反饋?zhàn)罱K都會(huì)歸結(jié)到Loonframework-Game這個(gè)框架(簡(jiǎn)稱LFG)上去。
浙公網(wǎng)安備 33010602011771號(hào)