【问题标题】:trouble converting void * back to struct将 void * 转换回 struct 时遇到问题
【发布时间】:2014-10-31 22:49:20
【问题描述】:

我正在开发一个使用 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 的指针,它一直运行良好。感谢所有的帮助,跟踪索引的概念让我想到了正确的方向。

【问题讨论】:

    标签: c++ box2d


    【解决方案1】:

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

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

    【讨论】:

    • 听起来不错。我将门向量存储在 Level 类中,因此我可以将指向它的指针指向 Contact 类,然后只需 (doors)[index] 即可获取我的信息。我无法将 void 更改回 int(它还警告我从较小的整数类型 'int' 转换为 'void*')。
    • 您可以使用 std::list 代替 std::vector。列表不改变其元素的地址。
    • 帕维尔:好点子! List 是更好的解决方案,只要不需要 operator[]
    猜你喜欢
    • 2016-08-13
    • 2020-06-24
    • 2016-01-20
    • 1970-01-01
    • 2014-02-28
    • 2022-01-25
    • 1970-01-01
    • 2013-03-05
    • 2018-01-08
    相关资源
    最近更新 更多