1

Here are my tools: CocosBuilder-2.1/CCBReader-2.1/cocos2d-iphone-2.0

I created TestNode.ccb(root object is CCNode), in it I create 2 timeline,@"t0name"(2s long) and @"t1name"(2s long), root node is set to custom class TestNode

I created 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

and here is the 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

There is also a main layer (TestScene.h/.m), in this scene i will add CCNode and some thing else...

Normal case:

In the main layer's onEnter(), I add an instance of TestNode and call it's playAnimation, according to the code above, the timeline named @"t0name" will be played forever, and what really happened is the same to my assumption.

Strange case: In the main layer's onEnter(), I add an instance of TestNode and call it's playAnimation, AND schedule a function [self schedule:@selector(changeTestNodeCondition) interval:1.0]; this function(changeTestNodeCondition) just set TestNode's condition to YES, according to the code above, the timeline named @"t0name" wil be played once(t0' length is 2s), then timeline named @"t1name" will be played once, then console will print "t1played" and everything stop, but what happened is:

  1. timeline named @"t0name" played once
  2. timeline named @"t1name" played once
  3. console print "t1played"
  4. timeline named @"t0name" played again
  5. console print "t1played" again

Why step4 happened? it cause completedAnimationSequenceNamed:(NSString *) name is called again and console print "t1played" again(step 5)

I checkd the TestNode.ccb, both timeline has no chained timeline, both timeline unchecked auto play, @"t0name" has sequenceId 0, @"t0name" has sequenceId 1, is timeline 0 autoplayed ??? Why???

I did another interesting experiment: I change timeline @"t0name" sequence id to 1, change timeline @"t1name" sequence id to 2 (edit the ccb file directly using any text editor), following thing happen:

  1. timeline named @"t0name" played once
  2. timeline named @"t1name" played once
  3. console print "t1played"
  4. console print "t1played" again and again and again... dead loop

I guess in this case CCAnimationManager try to play timeline 0, but timeline 0 is not there so there is no animation can be seen but the "play" operation is called and then completedAnimationSequenceNamed:(NSString *) name is called!

Shane Hou
  • 4,808
  • 9
  • 35
  • 50
Terry Z
  • 319
  • 2
  • 12

0 Answers0