中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      游戲中實現腳本控制的干貨分享

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

      游戲中實現腳本控制的干貨分享

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

        首先理解一下消息循環

        一個好的游戲離不開好的消息循環。它是游戲實現很重要的一部分。

        首先,我定義了一個全局變量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就是負責這項工作的。

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

      總監實現對施工進度控制方法03-06

      AutoCAD腳本制作03-20

      雅思備考干貨03-04

      PHP如何通過會話控制實現身份驗證03-29

      影視廣告的腳本創作03-20

      ASP腳本循環語句詳細教學01-23

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

      淘寶問答實戰運營干貨!03-20

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

      主站蜘蛛池模板: 日韩久久av电影| 洛川县| 国产日韩久久久久69影院| 辰溪县| 亚洲成av在线免费不卡| 2021年性爱喷水视频| 成人精品毛片在线观看| 在线免费观看亚洲天堂av| 粗大挺进尤物人妻一区二区| 日韩中文字幕在线乱码| 国产黑色丝袜在线观看视频| 亚洲大片免费播放地址| 五峰| 在线亚洲AV成人无码一区小说| 日本一区二区三区激情视频| 阳江市| 勐海县| 八宿县| 平昌县| 修文县| 青田县| 99久久精品国产自在首页| 99福利影院| 久久99久久99精品免视看国产成人 | 九九久久精品大片| 熟女系列丰满熟妇av| 草莓视频中文字幕人妻系列| 谷城县| 国产亚洲人成在线影院| 玖玖玖亚洲一区二区三区| 亚洲成熟丰满熟妇高潮XXXXX| 最大色网男人的av天堂 | 亚洲av激情综合在线| 亚洲午夜亚洲精品国产成人| 一区二区三区午夜视频在线观看| 国产视频网站一区二区三区| 亚洲AⅤ樱花无码| 久久久久久久久久91精品日韩午夜福利 | 太谷县| 人妻无码人妻有码不卡| 国产农村妇女一区二区三区|