ここに私のツールがあります: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」と出力され、すべてが停止しますが、何が起こったかは次のとおりです。
@"t0name"
一度だけ再生されたという名前のタイムライン@"t1name"
一度だけ再生されたという名前のタイムライン- コンソール出力「t1played」
@"t0name"
再び再生されたという名前のタイムライン- コンソール印刷 "t1played" 再び
なぜstep4が起こったのですか?原因completedAnimationSequenceNamed:(NSString *) name
が再度呼び出され、コンソールに "t1played" が再度表示されます (手順 5)
、両方TestNode.ccb
のタイムラインにチェーンされたタイムラインがなく、両方のタイムラインにチェックが入っていない自動再生、@"t0name"
ありsequenceId 0
、@"t0name"
ありsequenceId 1
、自動再生ありtimeline 0
??? どうして???
別の興味深い実験を行いました: タイムライン@"t0name"
シーケンス ID を 1 に変更し、タイムライン@"t1name
" シーケンス ID を 2 に変更 (任意のテキスト エディターを使用して ccb ファイルを直接編集) すると、次のことが起こります。
- @"t0name" という名前のタイムラインが 1 回再生されました
- @"t1name" という名前のタイムラインが 1 回再生されました
- コンソール出力「t1played」
- console print "t1played" 何度も何度も...デッドループ
CCAnimationManager
この場合は再生しようと思いますtimeline 0
がtimeline 0
、そこにないのでアニメーションは見られませんが、「再生」操作が呼び出されてからcompletedAnimationSequenceNamed:(NSString *) name
呼び出されます!