Box2D / UserData / Cocos2D:Box2D的子类化CCSprite失败了吗?

时间:2012-03-29 21:52:32

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

编辑: 我明白了:我的子类中的初始化过程错误了。换句话说,这个方法按照描述的方式工作,但如果您的子类初始化没有正确调用超类初始化方法,那么最终会使XCode变得困惑和粗暴。

案件结案。


感谢阅读。 我有一个问题,即子类CCSprite在通过Box2D主体的userData传递后无法正确地进行类型转换。

在主CCLayer的update()循环期间,我遍历所有Box2D对象以更新Cocos2D精灵位置。我通过设置

将Cocos2D精灵存储在box2D正文定义中
body->SetUserData((__bridge void*) newSprite);

在更新周期中,我通过执行以下操作检索该Sprite:

CCSprite* thisSprite = (__bridge CCSprite *) body->GetUserData();

到目前为止,这在我的项目中运作良好。但今天,我将CCSprite子类化为MySprite,并在检索时:

MySprite *sprite = (__bridge MySprite*)body->GetUserData();
if ([sprite isMemberOfClass:[MySprite class]]) {
    CCLOG(@"It's a MySprite.");
} else if ([sprite isMemberOfClass:[CCSprite class] ]) {
    CCLOG(@"It's a CCSprite.");
}
My_SpriteStuff* st = [sprite getMySpriteStuff];

...事实证明,虽然调试器声称 MySprite确实是MySprite(它甚至显示了它的属性),但日志会写入“它是一个CCSprite”。否则后面的代码行工作正常(在mysprite是CCSprite的前提下)并且可以访问CCSprite的属性和方法 - 但不能访问MySprite的属性和方法。

代码在最后一行崩溃,因为它无法访问“getMySpriteStuff”消息: 以下是日志的摘录:

"It's a CCSprite.
2012-03-29 16:53:27.145 OME-iOS[2290:1c403] -[CCSprite getMySpriteStuff]: unrecognized selector sent to instance 0x10de3930
2012-03-29 16:53:27.153 OME-iOS[2290:1c403] ERROR: Uncaught exception -[CCSprite getMySpriteStuff]: unrecognized selector sent to instance 0x10de3930"

任何人都知道我在这里做错了什么?这个代码一直工作,直到我开始子类化CCSprite ...换句话说,CCSprite通过Box2D UserData放入并检索,但我自己的类没有?!它必须是明显的东西。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我明白了:我的子类中的初始化过程错误了。换句话说,这个方法按照描述的方式工作,但如果您的子类初始化没有正确调用超类初始化方法,那么最终会使XCode变得困惑和粗暴。