我正在使用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并且它一直运行良好。感谢所有的帮助,追踪索引的想法让我思考正确的方向。
答案 0 :(得分:1)
如果您考虑一下,您会发现必须允许vector
模板类将其数据从一个地方移动到另一个地方。否则,动态调整大小(例如push_back
)是不可能的。因此,如果您获取元素的地址,然后更改向量的大小,则地址可能会变为无效。这就是你所看到的。
也许您可以使用FixtureDef.userData = static_cast<void*>(doors.size()-1)
存储元素的索引?