我一直在构建《学习 Cocos2D》一书中描述的 SpaceViking 项目。当我开始遇到问题时,我已经读到了 Box2D 的第 10 章。然后我尝试将 cocos2D 从版本 1 升级到版本 2.0。在进行必要的更改以修复弃用后,代码不再有效。具体来说,我发现当创建游戏对象或敌人对象时,它们的 init 方法不再被调用。例如,当执行以下行时:
RadarDish *radarDish = [[RadarDish alloc] initWithSpriteFrameName:@"radar_1.png"];
未调用 RadarDish init 方法。然后我查看了版本 1 和版本 2 中 initWithSpriteFrameName 的执行情况,发现 CCSprite.m 发生了变化,因此不再调用 init 方法。在版本 2 源代码中,initWithSpriteFrameName 方法调用 initWithSpriteFrame 调用 initWithTexture 调用:
-(id) initWithTexture:(CCTexture2D*)texture rect:(CGRect)rect rotated:(BOOL)rotated
{
if( (self = [super init]) ) {
因此,不会调用 RadarDish init 方法。相反,调用 CCNode init 方法。但是在版本 1 中,initWithSpriteFrameName 调用 initWithSpriteFrame 调用具有以下代码的 initWithTexture:
// IMPORTANT: [self init] and not [super init];
if( (self = [self init]) ){
[self setTexture:texture];
[self setTextureRect:rect];
}
这允许调用 RadarDish init 方法。
我能做些什么来解决这个问题?这本书似乎不太可能需要更改以支持升级到 cocos2d v2.0,所以我怀疑我一定遗漏了其他东西。但是,如果我错了,那么更改此代码以导致调用 RadarDish init 方法的方法是什么?