全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1619
推到 Plurk!
推到 Facebook!

怎樣在遊戲中實現腳本控制

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-27 13:21:06 IP:61.218.xxx.xxx 未訂閱
怎樣在遊戲中實現腳本控制 =================================================================     by Kylinx(吳振華) Howepage: kylinx.yeah.net E-mail:Game-diy@163.com QQ 30784290 版權所有    一個遊戲引擎做好了,最重要的是缺什麼?腳本。打個比方,遊戲引擎是一部電腦,則腳本就是電腦的軟件。既然腳本這麼重要,那該怎樣實現呢?下面我就來說說我的做法。    首先理解一下消息循環 一個好的遊戲離不開好的消息循環。它是遊戲實現很重要的一部分。下面我就來說說我的遊戲《宿命傳說》的做法。    首先,我定義了一個全局變量extern int GameState; 在遊戲中定義了許多當前的遊戲狀態例如    #define GAME_STATE_CUSTOM 0 //這代表在戰鬥中玩家可以控制遊戲 #define GAME_STATE_TALKING 1    等等。 好了,下面在WinMain裡面的while(1)循環中有個UpdateScreen()函數    原型為 void UpdateScreen() {     延時     switch(GameState)     {         case GAME_STATE_CUSTOM:             畫出地圖             畫出所有精靈             畫出天氣(如果有的話)             如果玩家選中了敵人的話(打個比方DrawFlag=DrawEnemyState)就顯示敵人的移動范圍和敵人狀態         break;         case GAME_STATE_TALKING:             GameDialogProc();         break;         case GAME_STATE_SCRIPTCONTROLLING:             ScriptControlProc();         break;         ….//其他的消息在這裡處理     }     將緩沖表面的圖象顯示到屏幕; }    每個遊戲狀態都需要一個獨立的函數來寫。這樣在每次切換遊戲狀態時都不會出現無法處理的情況。 在處理鍵盤消息的時候我也用一個個獨立的函數來寫 如處理回車鍵我用了 KeyReturnProc()來控制 在這個函數裡同樣也少不了switch(GameState)這一句,為什麼? 答案很簡單,比如說在精靈行走時回車鍵就沒有用,這是我沒有處理精靈行走這個狀態的鍵盤消息。而在戰鬥場景裡按下回車鍵,如果有精靈在選擇框裡的話,就會處理相應的東西。 例如選擇了敵人則使DrawFlag=DrawEnemyState;這樣在更新屏幕時就會畫出敵人的移動范圍和狀態。 明白了嗎?好了,如果你明白了消息循環的原理,下面的東西就很容易理解了。    下面談談腳本控制 要實現這個,就必須在UpdataScreen()這個函數中攔截一個“腳本控制”的消息,並調用相應的處理函數:ScriptControlProc(); 那麼怎樣得到“腳本控制”這個消息呢? 我是這樣約定的:新遊戲->調用腳本 "戰鬥結束"->調用腳本 “前往下一個地點”->調用腳本 好了,就隻有這幾種情況下才調用,調用腳本的函數為BeginScriptControl(); 這個函數做了三個工作: 1.首先讀取舞台(場景)角色的數據(沒一關都是一個不同的舞台) 2.打開腳本文件(注意要用全局的文件指針)(雖然我在源程序中沒直接打開,但是原理是一樣的) 3.將遊戲狀態設定為“腳本控制”以便在下一次UpdateScreen()中調用的是ScriptControlProc();(怎麼樣?知道消息循環的作用了吧?) ScriptControlProc()這個函數其實也很簡單: 讀取腳本文件中的參數直到文件結束    讀取腳本文件需要一個解釋腳本的函數LoadParam(FILE*fp); 這個函數負責解釋腳本中的東西:是函數調用還是函數參數 然後找到相應的函數執行即可 比如說腳本裡有一段代碼MovePlayerTo(1,1,1); 意思就是把第1個玩家移動到1,1處 怎樣做呢? 我是按照以下幾步做的 1.保存當前的遊戲狀態 2.把當前遊戲狀態設定為“移動精靈” 當引擎得到“移動精靈”這個函數後,在UpdataScreen()中調用的是 MoveRoleProc()這個函數 當移動結束後,MoveRoleProc()調用EndMoveRole(),這個函數的作用就是 讀取先前的遊戲狀態    怎麼樣?又回到讀腳本了吧?記住在移動角色的時候腳本文件的指針沒有改變, 所以回到讀腳本的這個函數後不是重新讀取而是繼續讀取! 同理其他的腳本指令如LoadDialog也是一樣的道理! 當文件要結束的時候,別忘了告訴引擎該停止了,這時候我們必須更新遊戲狀態 腳本裡的SetGameState就是負責這項工作的。 好了,先講到這裡,如果你有什麼不明白的地方請聯系我!       聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
系統時間:2024-03-28 22:06:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!