- 相關(guān)推薦
游戲中實(shí)現腳本控制的干貨分享
一個(gè)游戲引擎做好了,最重要的是缺什么?腳本。打個(gè)比方,游戲引擎是一部電腦,則腳本就是電腦的軟件。既然腳本這么重要,那該怎樣實(shí)現呢?下面yjbys小編就來(lái)說(shuō)說(shuō)自己的做法。想了解更多相關(guān)資訊請持續關(guān)注我們應屆畢業(yè)生培訓網(wǎng)。
首先理解一下消息循環(huán)
一個(gè)好的游戲離不開(kāi)好的消息循環(huán)。它是游戲實(shí)現很重要的一部分。
首先,我定義了一個(gè)全局變量extern int GameState;
在游戲中定義了許多當前的游戲狀態(tài)例如
#define GAME_STATE_CUSTOM 0 //這代表在戰斗中玩家可以控制游戲
#define GAME_STATE_TALKING 1
等等。
好了,下面在WinMain里面的while(1)循環(huán)中有個(gè)UpdateScreen()函數
原型為
void UpdateScreen()
{
延時(shí)
switch(GameState)
{
case GAME_STATE_CUSTOM:
畫(huà)出地圖
畫(huà)出所有精靈
畫(huà)出天氣(如果有的話(huà))
如果玩家選中了敵人的話(huà)(打個(gè)比方DrawFlag=DrawEnemyState)就顯示敵人的移動(dòng)范圍和敵人狀態(tài)
break;
case GAME_STATE_TALKING:
GameDialogProc();
break;
case GAME_STATE_SCRIPTCONTROLLING:
ScriptControlProc();
break;
….//其他的消息在這里處理
}
將緩沖表面的圖象顯示到屏幕;
}
每個(gè)游戲狀態(tài)都需要一個(gè)獨立的函數來(lái)寫(xiě)。這樣在每次切換游戲狀態(tài)時(shí)都不會(huì )出現無(wú)法處理的情況。在處理鍵盤(pán)消息的時(shí)候我也用一個(gè)個(gè)獨立的函數來(lái)寫(xiě),如處理回車(chē)鍵我用了 KeyReturnProc()來(lái)控制。在這個(gè)函數里同樣也少不了switch(GameState)這一句,為什么?答案很簡(jiǎn)單,比如說(shuō)在精靈行走時(shí)回車(chē)鍵就沒(méi)有用,這是我沒(méi)有處理精靈行走這個(gè)狀態(tài)的鍵盤(pán)消息。而在戰斗場(chǎng)景里按下回車(chē)鍵,如果有精靈在選擇框里的話(huà),就會(huì )處理相應的東西。
例如選擇了敵人則使DrawFlag=DrawEnemyState;這樣在更新屏幕時(shí)就會(huì )畫(huà)出敵人的移動(dòng)范圍和狀態(tài)。
明白了嗎?好了,如果你明白了消息循環(huán)的原理,下面的東西就很容易理解了。
下面談?wù)勀_本控制
要實(shí)現這個(gè),就必須在UpdataScreen()這個(gè)函數中攔截一個(gè)“腳本控制”的消息,并調用相應的處理函數:ScriptControlProc(); 那么怎樣得到“腳本控制”這個(gè)消息呢?我是這樣約定的:
新游戲->調用腳本
“戰斗結束”->調用腳本
“前往下一個(gè)地點(diǎn)”->調用腳本
好了,就只有這幾種情況下才調用,調用腳本的函數為BeginScriptControl();
這個(gè)函數做了三個(gè)工作:
1.首先讀取舞臺(場(chǎng)景)角色的數據(沒(méi)一關(guān)都是一個(gè)不同的舞臺)
2.打開(kāi)腳本文件(注意要用全局的文件指針)(雖然我在源程序中沒(méi)直接打開(kāi),但是原理是一樣的)
3.將游戲狀態(tài)設定為“腳本控制”以便在下一次UpdateScreen()中調用的是ScriptControlProc();(怎么樣?知道消息循環(huán)的作用了吧?)
ScriptControlProc()這個(gè)函數其實(shí)也很簡(jiǎn)單:
讀取腳本文件中的參數直到文件結束,讀取腳本文件需要一個(gè)解釋腳本的函數LoadParam(FILE*fp);這個(gè)函數負責解釋腳本中的東西:是函數調用還是函數參數,然后找到相應的函數執行即可。
比如說(shuō)腳本里有一段代碼MovePlayerTo(1,1,1);意思就是把第1個(gè)玩家移動(dòng)到1,1處。怎樣做呢?
我是按照以下幾步做的
1.保存當前的游戲狀態(tài)
2.把當前游戲狀態(tài)設定為“移動(dòng)精靈”
當引擎得到“移動(dòng)精靈”這個(gè)函數后,在UpdataScreen()中調用的是MoveRoleProc()這個(gè)函數。
當移動(dòng)結束后,MoveRoleProc()調用EndMoveRole(),這個(gè)函數的作用就是讀取先前的游戲狀態(tài)
怎么樣?又回到讀腳本了吧?記住在移動(dòng)角色的時(shí)候腳本文件的指針沒(méi)有改變,所以回到讀腳本的這個(gè)函數后不是重新讀取而是繼續讀取!同理其他的腳本指令如LoadDialog也是一樣的道理!
當文件要結束的時(shí)候,別忘了告訴引擎該停止了,這時(shí)候我們必須更新游戲狀態(tài)。腳本里的SetGameState就是負責這項工作的。
【游戲中實(shí)現腳本控制的干貨分享】相關(guān)文章:
AutoCAD腳本制作03-20
雅思備考干貨03-04
PHP如何通過(guò)會(huì )話(huà)控制實(shí)現身份驗證03-29
影視廣告的腳本創(chuàng )作03-20
ASP腳本循環(huán)語(yǔ)句詳細教學(xué)01-23
電影電視分鏡頭腳本格式03-16