• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Code Knight

            Programming is so cool
            隨筆 - 52, 文章 - 0, 評(píng)論 - 14, 引用 - 0
            數(shù)據(jù)加載中……

            基于LUA的AI模塊

                      前些天做了一個(gè)怪物AI模塊,起初的設(shè)計(jì)是基于C++的驅(qū)動(dòng)模式,只在必要的時(shí)候調(diào)用LUA腳本,諸如以下:
                      在AI模塊的Update(float dt)中根據(jù)AI的幾種可能性進(jìn)行相應(yīng)的更新,比如
                     
            1 void CAI::Update(float dt)
            2 {
            3       // 更新攻擊目標(biāo),沒(méi)有目標(biāo)尋找
            4      UpdateTarget();
            5      // 更新戰(zhàn)斗
            6      UpdateCombat();
            7     // 更新移動(dòng)
            8     UpdateMove();
            9 }

                       在相應(yīng)的Update中去檢測(cè)有沒(méi)有狀況發(fā)生,比如在UpdateTarget()中,這個(gè)怪物發(fā)現(xiàn)一個(gè)玩家進(jìn)入了自己的地盤,要?dú)瑒t發(fā)送一個(gè)事件給一個(gè)處理事件的函數(shù)ProcessEvent(int nEvent),這個(gè)事件可能會(huì)進(jìn)入一個(gè)狀態(tài)機(jī)然后在更改到一個(gè)進(jìn)入戰(zhàn)斗的狀態(tài),調(diào)用相應(yīng)的腳本函數(shù),在這個(gè)腳本函數(shù)里就去做自己想做的事。
                       但是這樣的Update并不好,思考了一下覺(jué)得還是要以AI狀態(tài)為基準(zhǔn)來(lái)Update比較適合和腳本交互。
                      
             1 void CAI::Update(float dt)
             2 {
             3   switch(m_nState)
             4   {
             5      case IDLE:
             6         {
             7              // 調(diào)用腳本,可能會(huì)調(diào)用尋找目標(biāo)的接口
             8         }
             9         break;
            10      case COMBAT:
            11         {
            12            // 調(diào)用腳本,調(diào)用戰(zhàn)斗接口
            13         }
            14         break;
            15   }
            16 }
                       這樣就比較靈活了。腳本只是程序員用來(lái)解放勞動(dòng)力的一種方式,做好功能接口讓更多非專業(yè)程序員也能定制游戲內(nèi)容,這是自己對(duì)于腳本的理解。但是沒(méi)有腳本交互經(jīng)驗(yàn),至于暴露給策劃的接口該有哪些,怎樣策劃用著舒服,自己還沒(méi)想好,如果在C++中,這些基本函數(shù)可以自己來(lái)做,直接把邏輯寫進(jìn)IDLE的case都可以,但用腳本方式進(jìn)入IDLE狀態(tài)后,腳本里肯定應(yīng)該有FindTarget()這樣的接口,那么這一句FindTarget()交給策劃去填上?我覺(jué)得還不如直接在C++代碼中補(bǔ)上一句來(lái)得實(shí)在,策劃肯定不會(huì)直接去在腳本接口里去if else,腳本的提供還真是傷腦筋,例如進(jìn)入戰(zhàn)斗狀態(tài)了,調(diào)用腳本里的戰(zhàn)斗接口,這個(gè)接口里又怎樣調(diào)用C++提供的接口,所有的戰(zhàn)斗過(guò)程都封裝成一個(gè)接口給策劃?那這個(gè)接口封裝的功能可能會(huì)很多很多,無(wú)疑是增加了工作量,并且策劃的使用也會(huì)有局限性。還是其中的邏輯仍然由程序員來(lái)編寫?該如何組織呢。另外每一幀的更新都回去調(diào)用腳本,這其中得消耗多少?

            posted on 2009-04-21 22:56 Code Knight 閱讀(1670) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 腳本

            99久久无码一区人妻a黑| 久久亚洲高清综合| 伊人久久无码精品中文字幕| 久久婷婷午色综合夜啪| 久久精品国产99国产精品导航 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 国产精品久久久久久久| 天天影视色香欲综合久久| 91精品国产91久久久久福利| 九九久久精品无码专区| 久久综合噜噜激激的五月天| 亚洲精品高清久久| 久久狠狠爱亚洲综合影院| 中文字幕亚洲综合久久| 午夜精品久久久久久久| 青青草原综合久久大伊人| 久久人人青草97香蕉| 欧美精品一本久久男人的天堂 | a级成人毛片久久| 老男人久久青草av高清| 国产—久久香蕉国产线看观看| 97久久香蕉国产线看观看| 欧美国产成人久久精品| 精品久久久久久国产牛牛app| 久久精品亚洲中文字幕无码麻豆| 亚洲精品无码久久久久去q | 国产99精品久久| 久久久久久久久久久久中文字幕| 伊色综合久久之综合久久| 久久久精品国产亚洲成人满18免费网站| 91久久成人免费| 99久久综合狠狠综合久久止| 亚洲精品国精品久久99热一| 久久人人爽人人人人爽AV| 国产免费久久精品99re丫y| 热99RE久久精品这里都是精品免费 | 亚洲午夜久久久久久久久电影网| 77777亚洲午夜久久多喷| 亚洲七七久久精品中文国产| 久久这里的只有是精品23| 伊人久久大香线蕉精品不卡|