这是我的工具: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”,一切都停止了,但发生的事情是:
- 时间线命名
@"t0name"
播放一次 - 时间线命名
@"t1name"
播放一次 - 控制台打印“t1played”
- 时间线命名
@"t0name"
再次播放 - 控制台再次打印“t1played”
为什么会发生第 4 步?它导致completedAnimationSequenceNamed:(NSString *) name
再次调用并再次控制台打印“t1played”(步骤 5)
我检查了TestNode.ccb
,两个时间线都没有链接的时间线,两个时间线都未选中自动播放,@"t0name"
有sequenceId 0
,@"t0name"
有sequenceId 1
,timeline 0
自动播放???为什么???
我做了另一个有趣的实验:我将时间轴@"t0name"
序列 ID 更改为 1,将时间轴@"t1name
序列 ID 更改为 2(直接使用任何文本编辑器编辑 ccb 文件),发生以下事情:
- 名为@“t0name”的时间线播放了一次
- 名为@"t1name" 的时间线播放了一次
- 控制台打印“t1played”
- 控制台打印“t1played”一次又一次……死循环
我猜在这种情况下CCAnimationManager
尝试播放timeline 0
,但timeline 0
不存在所以看不到动画,但调用“播放”操作然后completedAnimationSequenceNamed:(NSString *) name
调用!