游戲中實現(xiàn)腳本控制的干貨分享

    時間:2024-07-24 20:03:45 游戲動漫 我要投稿
    • 相關推薦

    游戲中實現(xiàn)腳本控制的干貨分享

      一個游戲引擎做好了,最重要的是缺什么?腳本。打個比方,游戲引擎是一部電腦,則腳本就是電腦的軟件。既然腳本這么重要,那該怎樣實現(xiàn)呢?下面yjbys小編就來說說自己的做法。想了解更多相關資訊請持續(xù)關注我們應屆畢業(yè)生培訓網(wǎng)。

      首先理解一下消息循環(huán)

      一個好的游戲離不開好的消息循環(huán)。它是游戲實現(xiàn)很重要的一部分。

      首先,我定義了一個全局變量extern int GameState;

      在游戲中定義了許多當前的游戲狀態(tài)例如

      #define GAME_STATE_CUSTOM 0 //這代表在戰(zhàn)斗中玩家可以控制游戲

      #define GAME_STATE_TALKING 1

      等等。

      好了,下面在WinMain里面的while(1)循環(huán)中有個UpdateScreen()函數(shù)

      原型為

      void UpdateScreen()

      {

      延時

      switch(GameState)

      {

      case GAME_STATE_CUSTOM:

      畫出地圖

      畫出所有精靈

      畫出天氣(如果有的話)

      如果玩家選中了敵人的話(打個比方DrawFlag=DrawEnemyState)就顯示敵人的移動范圍和敵人狀態(tài)

      break;

      case GAME_STATE_TALKING:

      GameDialogProc();

      break;

      case GAME_STATE_SCRIPTCONTROLLING:

      ScriptControlProc();

      break;

      ….//其他的消息在這里處理

      }

      將緩沖表面的圖象顯示到屏幕;

      }

      每個游戲狀態(tài)都需要一個獨立的函數(shù)來寫。這樣在每次切換游戲狀態(tài)時都不會出現(xiàn)無法處理的情況。在處理鍵盤消息的時候我也用一個個獨立的函數(shù)來寫,如處理回車鍵我用了 KeyReturnProc()來控制。在這個函數(shù)里同樣也少不了switch(GameState)這一句,為什么?答案很簡單,比如說在精靈行走時回車鍵就沒有用,這是我沒有處理精靈行走這個狀態(tài)的鍵盤消息。而在戰(zhàn)斗場景里按下回車鍵,如果有精靈在選擇框里的話,就會處理相應的東西。

      例如選擇了敵人則使DrawFlag=DrawEnemyState;這樣在更新屏幕時就會畫出敵人的移動范圍和狀態(tài)。

      明白了嗎?好了,如果你明白了消息循環(huán)的原理,下面的東西就很容易理解了。

      下面談談腳本控制

      要實現(xiàn)這個,就必須在UpdataScreen()這個函數(shù)中攔截一個“腳本控制”的消息,并調(diào)用相應的處理函數(shù):ScriptControlProc(); 那么怎樣得到“腳本控制”這個消息呢?我是這樣約定的:

      新游戲->調(diào)用腳本

      “戰(zhàn)斗結束”->調(diào)用腳本

      “前往下一個地點”->調(diào)用腳本

      好了,就只有這幾種情況下才調(diào)用,調(diào)用腳本的函數(shù)為BeginScriptControl();

      這個函數(shù)做了三個工作:

      1.首先讀取舞臺(場景)角色的數(shù)據(jù)(沒一關都是一個不同的舞臺)

      2.打開腳本文件(注意要用全局的文件指針)(雖然我在源程序中沒直接打開,但是原理是一樣的)

      3.將游戲狀態(tài)設定為“腳本控制”以便在下一次UpdateScreen()中調(diào)用的是ScriptControlProc();(怎么樣?知道消息循環(huán)的作用了吧?)

      ScriptControlProc()這個函數(shù)其實也很簡單:

      讀取腳本文件中的參數(shù)直到文件結束,讀取腳本文件需要一個解釋腳本的函數(shù)LoadParam(FILE*fp);這個函數(shù)負責解釋腳本中的東西:是函數(shù)調(diào)用還是函數(shù)參數(shù),然后找到相應的函數(shù)執(zhí)行即可。

      比如說腳本里有一段代碼MovePlayerTo(1,1,1);意思就是把第1個玩家移動到1,1處。怎樣做呢?

      我是按照以下幾步做的

      1.保存當前的游戲狀態(tài)

      2.把當前游戲狀態(tài)設定為“移動精靈”

      當引擎得到“移動精靈”這個函數(shù)后,在UpdataScreen()中調(diào)用的是MoveRoleProc()這個函數(shù)。

      當移動結束后,MoveRoleProc()調(diào)用EndMoveRole(),這個函數(shù)的作用就是讀取先前的游戲狀態(tài)

      怎么樣?又回到讀腳本了吧?記住在移動角色的時候腳本文件的指針沒有改變,所以回到讀腳本的這個函數(shù)后不是重新讀取而是繼續(xù)讀取!同理其他的腳本指令如LoadDialog也是一樣的道理!

      當文件要結束的時候,別忘了告訴引擎該停止了,這時候我們必須更新游戲狀態(tài)。腳本里的SetGameState就是負責這項工作的。

    【游戲中實現(xiàn)腳本控制的干貨分享】相關文章:

    總監(jiān)實現(xiàn)對施工進度控制方法03-06

    AutoCAD腳本制作03-20

    雅思備考干貨03-04

    PHP如何通過會話控制實現(xiàn)身份驗證03-29

    影視廣告的腳本創(chuàng)作03-20

    ASP腳本循環(huán)語句詳細教學01-23

    電影電視分鏡頭腳本格式03-16

    淘寶問答實戰(zhàn)運營干貨!03-20

    盤點游戲中的活動需求03-07

    91久久大香伊蕉在人线_国产综合色产在线观看_欧美亚洲人成网站在线观看_亚洲第一无码精品立川理惠

      中文字幕免费精品视频一级 | 中国精品视频久久久久久 | 欧美AⅤ资源在线播放 | 香蕉国产成版视频在线 | 这里精品国产清自在天天线 | 中文字幕一区二区三区日韩精品视频 |