从Box2d的用户数据中检查对象的类

时间:2013-07-26 16:15:44

标签: objective-c cocos2d-iphone box2d box2d-iphone

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

id object = b->GerUserData():

然后

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

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

任何人都可以帮助我。

由于

2 个答案:

答案 0 :(得分:4)

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

方法调用body-> GetUserData();返回一个void指针。这是在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"];

希望这有帮助

答案 1 :(得分:2)

我猜错误就在这一行:

id object = b->GetUserData();

这可能是因为返回类型是void指针。试着像这样抛出它:

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