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.

ブレークポイントを指定してデバッガーを使用すると、transmittingAnim=nilの値に気づきました。

だから、私が

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

その場合、 -(void)changeStateアニメーションは正しく機能します。

なぜ[self initAnimations]から(id)init呼ばれないのですか?cocos2dv.2テンプレートを使用しています。
よろしくお願いします。

4

1 に答える 1

2

チュートリアルはcocos2dテンプレートv.1.xxに基づいていますが、cocos 2d v.2.0を使用してプロジェクトを構築しているため、問題が発生しました。「Learning Cocos2D」という本を読む場合は、cocos2d-iphoneをロードすることを強くお勧めします。バージョン1.0.1。これがリンクダウンロードcocos2d1.xxブランチです

それでも最新のcocos2dテンプレートを使用したい場合は、アドバイスを提供できます。

  • このリンクの指示に従ってくださいcocos2dv2.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;  
        }
    

        これにより、CCSpriteのinitWithSpriteFrameNameメソッドを実行する前にGameObjectメソッドとGameCharacterinitメソッドを実行できます。Viking GameObjectは、ではなくで
             初期化されるため、わずかに異なるソリューションが必要でした。ただし、オーバーライドの実装は、基本的に上記のRadarDishの例と同じです。initWithSpriteFrameinitWithSpriteFrameName

于 2013-03-25T13:24:45.237 に答える