cocos2d-iphone:init方法无法正常工作

时间:2013-01-26 08:15:58

标签: cocos2d-iphone

我正在研究Strougo / Wenderlich教程(太空维京项目)。第4章我遇到了麻烦。

在RadarDish.m中:

    -(void)initAnimations
        {
          [self setTransmittingAnim: [self loadPlistForAnimationWithName:@"transmittingAnim" andClassName:NSStringFromClass([self class])]];
        }

     -(void)changeState:(CharacterStates)newState {
          [self stopAllActions];
          id action = nil;
          [self setCharacterState:newState];
          switch (newState) {
          .
          .
          case kStateIdle:
          action = [CCAnimate actionWithAnimation:transmittingAnim
                               restoreOriginalFrame:NO];
          break;             }
          if (action != nil) {
          [self runAction:action];
                             }
}
 -(id)init
    {
    self=[super init];
     if  (self!=nil) {
    .
    .
    [self initAnimations];
    .
    .
    }
  return self;
    }

与教程中的代码完全相同。失败:
 *** Assertion failure in -[CCAnimate initWithAnimation:], /Users/macowner/Documents/examples/SpaceViking/SpaceViking/libs/cocos2d/CCActionInterval.

使用带断点的调试器,我注意到transmitAnim的值= nil。

所以,如果我放线

[self setTransmittingAnim: 
[self loadPlistForAnimationWithName:@"transmittingAnim" andClassName:NSStringFromClass([self class])]]; 
进入的情况 -(void)changeState然后动画正常工作。

为什么来自[self initAnimations]的{​​{1}}未被调用? 我正在使用cocos2d v.2模板 非常感谢提前。

1 个答案:

答案 0 :(得分:2)

我遇到了问题,因为我一直在使用cocos 2d v.2.0构建项目,而教程是基于cocos 2d模板v.1.xx如果你要按照“学习Cocos2D”这本书,我强烈建议你加载cocos2d-iphone版本1.0.1。这是链接download cocos2d 1.x.x branch

如果您仍想使用最新的cocos2d模板,我可以给您一些建议:

  • 按照此链接cocos2d v2.0 migration guide
  • 中的说明操作
  • 您将需要修改大量弃用和更改,因此请使用this link了解如何修复这些弃用和更改。

    现在关于解决我在这里提到的问题的几句话。在每个GameObjects,EnemyObjects和PowerUps中,我添加了一个覆盖initWithFrameName的方法。

       -(id) initWithSpriteFrameName:(NSString*)frameName{
        if ((self=[super init])) {
            if ((self = [super initWithSpriteFrameName:frameName])) {
    
                CCLOG(@"### RadarDish initialized");
                [self initAnimations];                                   // 1
                characterHealth = 100.0f;                                // 2
                gameObjectType = kEnemyTypeRadarDish;                    // 3
                [self changeState:kStateSpawning];                       // 4
    
            }  
        }  
    return self;  
        }
    

    这允许GameObject和GameCharacter init方法在CCSprite的initWithSpriteFrameName方法运行之前运行。
    Viking GameObject必须有一个稍微不同的解决方案,因为它是用initWithSpriteFrame而不是initWithSpriteFrameName初始化的。但是,覆盖实现与上面的RadarDish示例基本相同。