1

我试图在检测与 Box2d 的碰撞时确定对象的类型。我希望能够将用户数据分配给一个对象并检查它是否属于正确的类类型

id object = b->GerUserData():

然后

if([object isKindOfClass:[MyClassObject class]])

但是我只是收到错误“无法使用'void *'类型的右值初始化'id'类型的变量

谁能帮我吗。

谢谢

4

2 回答 2

4

您的问题是您正在尝试将“id”类型的对象分配给 void * 类型

方法调用 body->GetUserData(); 返回一个空指针。这里是在 b2Body.h 的头文件中定义的

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

现在,如果您使用的是 ARC(自动引用计数),您需要执行一个额外的步骤来将其回滚。

 id object = (__bridge id) b->GetUserData();

如果您不使用ARC,那么...

 id object = (id) b->GetUserData();

至于检查类型,有很多方法可以做到这一点。我个人更喜欢有一个名为 GameObjectType 的枚举。然后我可以在对象的适当构造函数中分配类型。这是我在游戏中如何做到这一点的示例

 for (b2Body * b = world->GetBodyList(); b != NULL; b = b->GetNext()) {

    Box2DSprite * sprite = (__bridge Box2DSprite*) b->GetUserData();
    id obj = (__bridge id) b->GetUserData();


    if (sprite.gameObjectType == kGroundTypeStatic
        || sprite.gameObjectType == kWallType
        || sprite.gameObjectType == kGroundTypeDynamic) {

        // Insert Logic here
    } // end if

    sprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
    sprite.rotation = CC_RADIANS_TO_DEGREES(b->GetAngle() * -1);

} // end for

以下是我将如何创建精灵(使用 ARC)

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position = b2Vec2(location.x/PTM_RATIO,
                      location.y/PTM_RATIO);

// Setting the enum value
self.gameObjectType = kTankType;
self->body = self->world->CreateBody(&bodyDef);
self->body->SetUserData((__bridge void*) self); // Obtain sprite object later

GB2ShapeCache * shapeCache = [GB2ShapeCache sharedShapeCache];

[shapeCache addFixturesToBody:self->body forShapeName:@"Earth_Tank"];

self.anchorPoint = [shapeCache anchorPointForShape:@"Earth_Tank"];

希望这可以帮助

于 2013-07-26T19:11:07.360 回答
2

我猜错误在这一行:

id object = b->GetUserData();

这可能是因为返回类型是 void 指针。尝试像这样投射它:

id object = (id)b->GetUserData();
于 2013-07-26T16:51:07.083 回答