1

我正在学习 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.

使用带断点的调试器,我注意到传输动画的值 = nil。

所以,如果我把线与

[self setTransmittingAnim: 
[self loadPlistForAnimationWithName:@"transmittingAnim" andClassName:NSStringFromClass([self class])]]; 

在这种情况下, -(void)changeState动画可以正常工作。

为什么[self initAnimations]from(id)init不被调用?我使用 cocos2d v.2 模板。
非常感谢提前。

4

1 回答 1

2

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

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

  • 按照此链接cocos2d v2.0 迁移指南中的说明进行操作
  • 您将有很多弃用和更改需要修复,因此请使用此链接 了解如何修复这些弃用和更改。

    现在就我在这里提到的问题的解决方案说几句话。在每个 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的示例基本相同。

于 2013-03-25T13:24:45.237 回答