b2Body::SetUserData已经被弃用了吗?

4

我正在设置一个box2d物体,参考以前的一些代码。在我的旧代码中,在设置好物体的最后,有这一行:

body->SetUserData(this);

如果我查看 Box2D 源代码,我可以找到这个函数。

inline void b2Body::SetUserData(void* data)
{
    m_userData = data;
}

然而,当我尝试将这个用户数据设置到我的新项目中(可能使用更高版本的box2d),该函数就不存在了。

这个函数是否已被弃用?或者我是否不小心删除了应该存在的函数?


你在源代码中看哪里?你怎么观察“该函数不存在”? - sehe
@sehe 在我的另一个程序中,它直接在getter上方,在我的当前项目中没有函数。我对setter进行了ctrl+f搜索,并搜索了每个成员变量被设置的情况,编译错误确认该类没有成员SetUserData - Jay
你应该包含错误信息。 - sehe
1
@sehe,我觉得我刚刚找到了解决方案,我会发布一个答案。 - Jay
好的。我还在逐渐熟悉 HelloWorld 的使用 :) - sehe
1个回答

3

经进一步调查,我发现该函数已被弃用,因为用户数据的设置已更改为具有包装结构。

旧设置如下:

class b2Body
{
public:
    /// Get the user data pointer that was provided in the body definition.
    void* GetUserData() const;

    /// Set the user data. Use this to store your application specific data.
    void SetUserData(void* data);
 
private:
    void* m_userData;

};

inline void b2Body::SetUserData(void* data)
{
    m_userData = data;
}

inline void* b2Body::GetUserData() const
{
    return m_userData;
}

但现在已经改变为:

class B2_API b2Body
{
public:
    /// Get the user data pointer that was provided in the body definition.
    b2BodyUserData& GetUserData();

private:
    b2BodyUserData m_userData;

};

inline b2BodyUserData& b2Body::GetUserData()
{
    return m_userData;
}

这个结构体b2BodyUserData的定义如下:

struct B2_API b2BodyUserData
{
    b2BodyUserData()
    {
        pointer = 0;
    }

    /// For legacy compatibility
    uintptr_t pointer;
};

因此,设置用户数据的方法不再需要 SetUserData(),因为GetUserData()返回对该结构体的非常量引用,可以修改该引用以提供相同的功能。

你的意思是:b2BodyUserData data = pBody[0]->GetUserData(); data.pointer = (uintptr_t)"mydata"; 吗? - nephewtom
@nephewtom 是的,确切地说,现在就是这样做的。 - Jay
1
谢谢!是的,它可以在函数体内和函数体定义中使用。例如,像这样做:struct Entity { b2BodyDef def; Entity() { def.userData.pointer = reinterpret_cast<uintptr_t>(this); ... }。顺便说一下,很棒的游戏“Polychrome”!受到HUE的启发了吗? - nephewtom
@nephewtom 谢谢 :D 每个人都这样问,也许是下意识的,但我们在制作时忘记了 HUE 存在,哈哈 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接