编码是艺术

游戏编程

博客园 首页 新随笔 联系 订阅 管理


所有的事都很简单
----- 从原始状态开始

我看过很多别人的文章,有些可以看懂,有些则不能,但我每次看懂时都会觉得很简单的,其实我浪费了很多心思去了解作者的习惯和一些基础但将数不清楚的内容上,这是一个讨论AI的文章,不便在此对其他更基础的东西进行讨论,但是介绍一些与所要讨论的主题有关的内容是必要的,以免浪费讨论主题的时间。我假设你已经是一个能够写Windows程序,并能独立完成一个能够控制小人在地板上走动的人。如果还不能最好去学好那些基础,否则看着些代码将会很头痛。
 

 

我们将在AiTestApp.cpp 里面开始我们的介绍。
HRESULT CAiTestApp::Init() 用于初始化一些对象数据 如果调用失败就返回一个E_FAIL; 如果调用成功就返回S_OK;
HRESULT CAiTestApp::Release() 用于是放在 Init 中初始化的对象。最后返回S_OK;
LRESULT CAiTestApp::OnMessage( UINT message, WPARAM wParam, LPARAM lParam ) 用于接收消息,这里一半用于接收windows消息,如键盘鼠标等响应消息。
void CAiTestApp::Process() 系统每隔 33 毫秒就调用一次,我们把这个作为主处理函数。

HRESULT CAiTestApp::Render() 每次调用了Process render就会被请求调用,基本可以跟上显示更新速度。

一般来说我们建立每一个要在系统中运行的对象都有以上几个处理函数。都很象。
class CObject
{
    bool Init();
    void Release();
 OnMessage(UINT message, WPARAM wParam, LPARAM lParam );
    Void Process();
    Void Render();
};
事物 { 初始化,释放,消息响应,处理,渲染 } 我在考虑这个对象的内容时就不必考虑别的对象。

CStageScene, CCharacter 这两个都属于AI的环境(一切都是AIWorker的环境) CCharacter 语义上说过的 有行为对象相对应。
// 游戏中有行为的对象
class IActionObject : public IObject
这个对象有两个状态和一个行为, {空闲(eaIdle) 行走(esWalk)} 和 { 向哪个方向移动(MoveTo( dir)) }

CStageScene 给出了人物行走的空间参照坐标。人物的移动都是参照这个坐标系的。

有行为的对象必须理解:基本上是,做事情依赖于状态机和指令作相应的动作,
例如我发出 MoveTo 指令 那他一定听话去做移动一步。

接下来是虚拟机,前面提出过要建立一套AI语言才能更好的表达。写出更可自定义的AI。关于这部分的代码不便说明,
CMD_BEGIN( Move )

    virtual bool Create( const char *szParam ) 
    {
        m_iDir = atoi( szParam );
        return true;
    }
    virtual int Execute( const int IP ) 
    {
        theApp.m_Char.MoveTo((CCharacter::enumDir)m_iDir);
        theApp.m_VM.m_Status.Pause();
        return (IP+1);
    }

CMD_PARAM

    int m_iDir;

CMD_END

以上是一个完整的指令定义 只要在VMSCommand.cpp中 用 CMD_BEGIN( 命令名 ) 来定义一个命令. Create中进行参数提取, 把提取出来的参数付给 CMD_PARAM处定义的参数。在Execute里就可以写你的功能,如这里调用了主角的MoveTo。

为了实现我前面提到的AI实现想法,我做了这些测试环境。以上是对各部分的功能简单介绍一下。如果有兴趣继续讨论下面的实现方法,请尽快理解一下这部分代码。这样才好有个可以交流的环境。/Files/Anima64/sf_2004610142933.zip

posted on 2007-01-13 13:17  宋良  阅读(306)  评论(0编辑  收藏  举报