怎樣在遊戲設計製作中實現指令碼控制(轉)
怎樣在遊戲設計製作中實現指令碼控制(轉)[@more@] 一個遊戲引擎做好了,最重要的是缺什麼?指令碼。打個比方,遊戲引擎是一部電腦,則指令碼就是電腦的軟體。既然指令碼這麼重要,那該怎樣實現呢?下面我就來說說我的做法。 首先理解一下訊息迴圈 一個好的遊戲離不開好的訊息迴圈。它是遊戲實現很重要的一部分。下面我就來說說我的遊戲《宿命傳說》的做法。 首先,我定義了一個全域性變數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; ….//其他的訊息在這裡處理 } 將緩衝表面的圖象顯示到螢幕; } 每個遊戲狀態都需要一個獨立的函式來寫。這樣在每次切換遊戲狀態時都不會出現無法處理的情況。 在處理鍵盤訊息的時候我也用一個個獨立的函式來寫 如處理Enter鍵我用了 KeyReturnProc()來控制 在這個函式里同樣也少不了switch(GameState)這一句,為什麼? 答案很簡單,比如說在精靈行走時Enter鍵就沒有用,這是我沒有處理精靈行走這個狀態的鍵盤訊息。而在戰鬥場景裡按下Enter鍵,如果有精靈在選擇框裡的話,就會處理相應的東西。 例如選擇了敵人則使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就是負責這項工作的。 好了,先講到這裡,如果你有什麼不明白的地方請聯絡我
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951671/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 怎樣在PB中實現檔案的複製與刪除 (轉)
- 在遊戲製作中渲染公式推導(轉)遊戲公式
- 怎樣在電子遊戲裡製作自然紀錄片?遊戲
- 遊戲設計製作中對鎖定設定的應用(轉)遊戲設計
- 在遊戲製作中的地形渲染terrainrender(轉)遊戲AI
- 數錢遊戲連結、二維碼,怎樣快速製作遊戲
- 在遊戲中設計動物是怎樣一種體驗?遊戲
- 在WIN95中實現檔案複製的程式設計方法 (轉)程式設計
- python中怎樣執行指令碼Python指令碼
- 商場導航怎麼實現?怎樣製作商場導航圖?
- 怎樣在squid中透過URL進行訪問控制(轉)UI
- 遊戲策劃設計中關於遊戲節奏的控制(轉)遊戲
- 在LINUX中實現流量控制器(轉)Linux
- Linux程式設計:將PHP作為Shell指令碼使用(轉)Linux程式設計PHP指令碼
- 詳細介紹在遊戲製作中的分形演算法(轉)遊戲演算法
- 在Oracle中實現資料庫的複製(轉)Oracle資料庫
- Delphi程式設計:完全控制桌面的實現 (轉)程式設計
- 《她的故事》《說謊》創作者:我是怎樣在遊戲中創作故事?遊戲
- 完成遊戲策劃設計製作的關鍵:推動力(轉)遊戲
- 在設計模式中是怎樣達到弱耦合的?設計模式
- 製作暴力遊戲的人平時在過什麼樣的日子?遊戲
- 在網頁中怎樣使文字旋轉? (轉)網頁
- 電腦遊戲中的人工智慧製作 (轉)遊戲人工智慧
- 非同步程式設計在ArkTS中具體怎麼實現?非同步程式設計
- 在LoadRunner指令碼中實現隨機ThinkTime指令碼隨機
- CpuMemSets在Linux作業系統中的實現(轉)Linux作業系統
- 《怎樣實現通過shell指令碼將使用者踢出系統》指令碼
- 在Oracle中怎樣才能使用索引(轉)Oracle索引
- 怎 樣 在APPLET 中 發EMAIL (轉)APPAI
- 怎樣在windows上定時執行python指令碼WindowsPython指令碼
- 在遊戲中,“我”是一種怎樣的存在?遊戲
- 遊戲製作之我見:) (轉)遊戲
- 怎麼樣在JBUILDERX中實現會話BEAN訪問實體BEAN??UI會話Bean
- Linux作業系統的Shell程式設計指令碼欣賞(轉)Linux作業系統程式設計指令碼
- 怎樣使用ASP實現Ping (轉)
- 在WPF設計工具Blend2中製作立方體圖片效果
- 使用BCB製作控制面版程式 (轉)
- OpenMP 原子指令設計與實現