麻烦将void *转换回struct

时间:2014-10-31 22:49:21

标签: c++ box2d

我正在使用Box2D进行物理游戏并遇到void *问题。

Box2D灯具有一个(void *)userData字段,对于我级别的门,我将其设置为门信息的地址,这是一个名为NextLevel的结构(下图)。

struct NewLevel {
    bool changed;
    std::string name;
    int x;
    int y;
    int posx;
    int posy;
    int num;
};

门存放在std::vector<NewLevel> doors的关卡中。在组装每个级别的循环中,如果有一个门,我doors.push_back(NewLevel())然后相应地设置数据。然后我存储FixtureDef.userData = &doors.back()

然而,当我去检索那些信息时,它并没有成功。 (fixB是指向接触夹具的指针)。

NewLevel nextDoor = *(static_cast<NewLevel*>(fixB->GetUserData()))

有时,它只是有效。然而,在其他时候,它给了胡言乱语。当我加载下一个级别时,我清除了向量。我打印指针很多,有时,它们不匹配,会导致什么?有没有更好的方法来传递这些数据?

谢谢! (如果需要,我可以添加更多代码)

修改

我最终通过存储来自box2d的b2Fixture *和门向量中项目的索引来解决这个问题,而不是试图将指针强制转换/重新投射到NewLevel并且它一直运行良好。感谢所有的帮助,追踪索引的想法让我思考正确的方向。

1 个答案:

答案 0 :(得分:1)

如果您考虑一下,您会发现必须允许vector模板类将其数据从一个地方移动到另一个地方。否则,动态调整大小(例如push_back)是不可能的。因此,如果您获取元素的地址,然后更改向量的大小,则地址可能会变为无效。这就是你所看到的。

也许您可以使用FixtureDef.userData = static_cast<void*>(doors.size()-1)存储元素的索引?