• 注册
欢迎加入behaviac Q&A网站。behaviac是腾讯开源组件https://github.com/TencentOpen/behaviac 官方网站:http://www.behaviac.com/,提供各种文档和教程及手册 为了您及时的获得您最新问题的评论或者回答,请提供并验证您的邮箱
欢迎来到 behaviac Q&A。 您在bbs里的问题,管理员会当下就收到通知,不要担心管理员看不到您的问题。也请在bbs里提供您的email,这样就可以第一时间收到关于回答,评论的email的通知了。 为了节省大家的时间,请表达好你的问题,提供必要上下文,版本号,平台信息,重现步骤等。

在bt中需要传入自定义的参数引用,要注意哪些事项呀

1 喜欢 0 不喜欢
353 浏览
struct btPosition3D
{
    float x;
    float y;
    float z;
    btPosition3D()
    {
        x = 0.0f;
        y = 0.0f;
        z = 0.0f;
    }
    btPosition3D(const Position3D& v) : x(v.x), y(v.y), z(v.z)
    {
    }
    DECLARE_BEHAVIAC_STRUCT(btPosition3D, true);
};
BEHAVIAC_EXTEND_EXISTING_TYPE(btPosition3D, Position3D);
特化了模板函数(略)

 
我需要在FireEvent的时候使用Position3D这个类的引用来传参,可是
    behaviac::TypeRegister::Register<Position3D&>("Position3D&");这个编译不过,
    behaviac::TypeRegister::Register<Position3D>("Position3D");这个又会报没有注册"Position3D&"的运行错误,
    behaviac::TypeRegister::Register<Position3D>("Position3D&");这个在使用的时候报类型不一致的错误。
bt配置中参数类型为Position3D&,请问我哪个细节漏掉了呢,到底该怎么使用才是正确的呀。
最新提问 4月 25, 2016 用户: qq_570762bf0f5de (450 分)
标签修改 4月 26, 2016 用户:jonygli

1个回答

0 喜欢 0 不喜欢
DECLARE_BEHAVIAC_STRUCT(btPosition3D, true);为什么要用true?

在btunittest里搜索BEHAVIAC_EXTEND_EXISTING_TYPE,可以找到例子。

具体可以参考TestNS::Float2
最新回答 4月 25, 2016 用户: jonygli (57,510 分)
修改于 4月 25, 2016 用户:jonygli
你先在任务的原型中把引用去掉,不要用引用试试看。
  1. 你先在任务的原型中把引用去掉。
  2. 我后续更新个版本就可以支持传引用类型了。

嗯,不用引用确实可以了。新的问题是FireEvent执行有空指针异常。下面红色代码执行前this->m_currentTask是非空,执行后this->m_currentTask就成为NULL了。

    bool BranchTask::oneventCurrentNode(Agent* pAgent, const char* eventName)

    {

        BEHAVIAC_ASSERT(this->m_currentTask);

        EBTStatus s = this->m_currentTask->GetStatus();

        BEHAVIAC_UNUSED_VAR(s);

        BEHAVIAC_ASSERT(s == BT_RUNNING && this->m_node->HasEvents());

        bool bGoOn = this->m_currentTask->onevent(pAgent, eventName);

        //give the handling back to parents

        if (bGoOn)

        {

            BranchTask* parentBranch = this->m_currentTask->GetParent();

            //back track the parents until the branch

            while (parentBranch && parentBranch != this)

            {

                BEHAVIAC_ASSERT(parentBranch->GetStatus() == BT_RUNNING);

                bGoOn = parentBranch->onevent(pAgent, eventName);

                if (!bGoOn)

                {

                    return false;

                }

                parentBranch = parentBranch->GetParent();

            }

        }

        return bGoOn;

    }

先改成下面的试试吧:

image

OK,没问题了。
...