1

ここに私のツールがあります:CocosBuilder-2.1/CCBReader-2.1/cocos2d-iphone-2.0

私が作成したTestNode.ccb(ルートオブジェクトはCCNodeです)、その中に2つのタイムライン@"t0name"(長さ2秒)と(長さ2秒)を作成し@"t1name"、ルートノードはカスタムクラスに設定されていますTestNode

私が作成しましたTestNode.h

#import "CCBAnimationManager.h"

@interface TestNode : CCNode <CCBAnimationManagerDelegate>{

}
@property (nonatomic, assign) BOOL condition;
@property (nonatomic, assign) BOOL t1Played;

-(void)playAnimation:(NSString *)name;
-(void)playAnimation;

@end

そしてここにあるTestNode.m

#import "TestNode.h"
#import "CCBReader.h"

@implementation TestNode

@synthesize condition;
@synthesize t1Played;

-(void)playAnimation:(NSString *)name{
    CCBAnimationManager* animationManager = self.userObject;
    [animationManager runAnimationsForSequenceNamed:name];
}

-(void)playAnimation{
    if(self.condition==YES) {
        [self playAnimation:@"t1name"];
        self.t1played=YES;
    }else{
        [self playAnimation:@"t0name"];
    }
}

-(void)didLoadFromCCB{
    CCBAnimationManager* animationManager = self.userObject;
    animationManager.delegate = self;
}

-(void)completedAnimationSequenceNamed:(NSString *)pName{
    if (self.t1played==YES) {
        NSLog(@"t1played");
    }else{
        [self playAnimation];
    }
}

@end

また、メイン レイヤー ( TestScene.h/.m) もあります。このシーンではCCNode、何か他のものを追加します...

通常の場合:

メイン レイヤーのonEnter() に、playAnimation のインスタンスを追加しTestNodeて呼び出します。上記のコードに従って、指定されたタイムライン@"t0name"が永久に再生され、実際に起こったことは私の仮定と同じです。

奇妙なケース: メイン レイヤーのonEnter()に のインスタンスを追加してTestNodeを呼び出しplayAnimation、関数をスケジュールします[self schedule:@selector(changeTestNodeCondition) interval:1.0];this function( changeTestNodeCondition)TestNodeの条件を YES に設定しただけです。上記のコードによれば、@"t0name"wil という名前のタイムラインが 1 回再生されます (t0'長さは 2 秒です) 。 )、その後、指定されたタイムライン@"t1name"が 1 回再生され、コンソールに「t1played」と出力され、すべてが停止しますが、何が起こったかは次のとおりです。

  1. @"t0name"一度だけ再生されたという名前のタイムライン
  2. @"t1name"一度だけ再生されたという名前のタイムライン
  3. コンソール出力「t1played」
  4. @"t0name"再び再生されたという名前のタイムライン
  5. コンソール印刷 "t1played" 再び

なぜstep4が起こったのですか?原因completedAnimationSequenceNamed:(NSString *) nameが再度呼び出され、コンソールに "t1played" が再度表示されます (手順 5)

、両方TestNode.ccbのタイムラインにチェーンされたタイムラインがなく、両方のタイムラインにチェックが入っていない自動再生、@"t0name"ありsequenceId 0@"t0name"ありsequenceId 1、自動再生ありtimeline 0??? どうして???

別の興味深い実験を行いました: タイムライン@"t0name"シーケンス ID を 1 に変更し、タイムライン@"t1name" シーケンス ID を 2 に変更 (任意のテキスト エディターを使用して ccb ファイルを直接編集) すると、次のことが起こります。

  1. @"t0name" という名前のタイムラインが 1 回再生されました
  2. @"t1name" という名前のタイムラインが 1 回再生されました
  3. コンソール出力「t1played」
  4. console print "t1played" 何度も何度も...デッドループ

CCAnimationManagerこの場合は再生しようと思いますtimeline 0timeline 0、そこにないのでアニメーションは見られませんが、「再生」操作が呼び出されてからcompletedAnimationSequenceNamed:(NSString *) name呼び出されます!

4

0 に答える 0