1

这是我的工具:CocosBuilder-2.1/CCBReader-2.1/cocos2d-iphone-2.0

我创建了TestNode.ccb(根对象是 CCNode),在其中我创建了 2 个时间线,@"t0name"(2s 长)和@"t1name"(2s 长),根节点设置为自定义类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() 中,我添加了一个实例TestNode并命名为 playAnimation,根据上面的代码,命名的时间线@"t0name"将永远播放,实际发生的情况与我的假设相同。

奇怪的情况:在主层中onEnter(),我添加了一个实例TestNode并调用它playAnimation,并调度了一个函数[self schedule:@selector(changeTestNodeCondition) interval:1.0];this function( changeTestNodeCondition)只是将TestNode'条件设置为YES,根据上面的代码,@"t0name"将播放一次名为的时间线(t0'长度为2s ),然后命名的时间线@"t1name"将播放一次,然后控制台将打印“t1played”,一切都停止了,但发生的事情是:

  1. 时间线命名@"t0name"播放一次
  2. 时间线命名@"t1name"播放一次
  3. 控制台打印“t1played”
  4. 时间线命名@"t0name"再次播放
  5. 控制台再次打印“t1played”

为什么会发生第 4 步?它导致completedAnimationSequenceNamed:(NSString *) name再次调用并再次控制台打印“t1played”(步骤 5)

我检查了TestNode.ccb,两个时间线都没有链接的时间线,两个时间线都未选中自动播放,@"t0name"sequenceId 0@"t0name"sequenceId 1timeline 0自动播放???为什么???

我做了另一个有趣的实验:我将时间轴@"t0name"序列 ID 更改为 1,将时间轴@"t1name序列 ID 更改为 2(直接使用任何文本编辑器编辑 ccb 文件),发生以下事情:

  1. 名为@“t0name”的时间线播放了一次
  2. 名为@"t1name" 的时间线播放了一次
  3. 控制台打印“t1played”
  4. 控制台打印“t1played”一次又一次……死循环

我猜在这种情况下CCAnimationManager尝试播放timeline 0,但timeline 0不存在所以看不到动画,但调用“播放”操作然后completedAnimationSequenceNamed:(NSString *) name调用!

4

0 回答 0