我正在尝试在检测到与Box2d的碰撞时确定对象的类型。我希望能够将用户数据分配给一个对象,并检查它是否具有正确的类类型
id object = b->GerUserData():
然后
if([object isKindOfClass:[MyClassObject class]])
然而,我只是得到错误“无法使用'void *'类型的右值初始化类型'id'的变量
任何人都可以帮助我。
由于
答案 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();