Code Knight

Programming is so cool
随笔 - 52, 文章 - 0, 评论 - 14, 引用 - 0
数据加载中……

基于LUA的AI模块

          前些天做了一个怪物AI模块,起初的设计是基于C++的驱动模式,只在必要的时候调用LUA脚本,诸如以下:
          在AI模块的Update(float dt)中根据AI的几种可能性进行相应的更新,比如
         
1 void CAI::Update(float dt)
2 {
3       // 更新攻击目标,没有目标寻找
4      UpdateTarget();
5      // 更新战斗
6      UpdateCombat();
7     // 更新移动
8     UpdateMove();
9 }

           在相应的Update中去检测有没有状况发生,比如在UpdateTarget()中,这个怪物发现一个玩家进入了自己的地盘,要殴之,则发送一个事件给一个处理事件的函数ProcessEvent(int nEvent),这个事件可能会进入一个状态机然后在更改到一个进入战斗的状态,调用相应的脚本函数,在这个脚本函数里就去做自己想做的事。
           但是这样的Update并不好,思考了一下觉得还是要以AI状态为基准来Update比较适合和脚本交互。
          
 1 void CAI::Update(float dt)
 2 {
 3   switch(m_nState)
 4   {
 5      case IDLE:
 6         {
 7              // 调用脚本,可能会调用寻找目标的接口
 8         }
 9         break;
10      case COMBAT:
11         {
12            // 调用脚本,调用战斗接口
13         }
14         break;
15   }
16 }
           这样就比较灵活了。脚本只是程序员用来解放劳动力的一种方式,做好功能接口让更多非专业程序员也能定制游戏内容,这是自己对于脚本的理解。但是没有脚本交互经验,至于暴露给策划的接口该有哪些,怎样策划用着舒服,自己还没想好,如果在C++中,这些基本函数可以自己来做,直接把逻辑写进IDLE的case都可以,但用脚本方式进入IDLE状态后,脚本里肯定应该有FindTarget()这样的接口,那么这一句FindTarget()交给策划去填上?我觉得还不如直接在C++代码中补上一句来得实在,策划肯定不会直接去在脚本接口里去if else,脚本的提供还真是伤脑筋,例如进入战斗状态了,调用脚本里的战斗接口,这个接口里又怎样调用C++提供的接口,所有的战斗过程都封装成一个接口给策划?那这个接口封装的功能可能会很多很多,无疑是增加了工作量,并且策划的使用也会有局限性。还是其中的逻辑仍然由程序员来编写?该如何组织呢。另外每一帧的更新都回去调用脚本,这其中得消耗多少?

posted on 2009-04-21 22:56 Code Knight 阅读(1662) 评论(0)  编辑 收藏 引用 所属分类: 脚本


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理