2009-06-23 60 views
1

cocos2d的定义静态方法“行动”的序列类这样:运行时动态长度操作列表顺序

+(id) actions: (FiniteTimeAction *) action1, ... { /* omitted */ } 

我怎么能建立一个动作列表在运行时执行,也许从磁盘文件或其他文件读取?

,我读了可变长度的参数列表可以翻译成(字符*),并以这种方式通过......

NSMutableArray *actions = [[NSMutableArray alloc] init]; 
[actions addObject: [DelayTime actionWithDuration:1]]; 
[actions addObject: [ScaleBy actionWithDuration:2 scale:4]; 

char *argList = (char *)malloc(sizeof(FiniteTimeAction *) * [actions count]); 
[actions getObjects:(id *)argList]; 

[self runActions: actions]; 

这是“最好的方法”或“正确的”方式做这个?他们是更好的选择,更快的选择?

回答

2

的vaargs只是一个帮手构建嵌套的Sequence对象。它返回一个FiniteTimeAction*,它是通过连续调用[Sequence actionOne:one_ two:two_]构建的。你可以通过遍历你的set或array来自己完成代码。它应该是这样的:

FiniteTimeAction *seq = nil; 
for (FiniteTimeAction *action in actions) { 
    if (!seq) { 
     seq = action; 
    } else { 
     seq = [Sequence actionOne:seq two:action]; 
    } 
} 
[self runActions:seq]; 
-1

也许一组预建序列?

id move = [MoveBy actionWithDuration:3 position:ccp(350,0)]; 
id move_back = [move reverse]; 

id move_ease_in = [EaseIn actionWithAction:[[move copy] autorelease] rate:3.0f]; 
id move_ease_in_back = [move_ease_in reverse]; 

id move_ease_out = [EaseOut actionWithAction:[[move copy] autorelease] rate:3.0f]; 
id move_ease_out_back = [move_ease_out reverse]; 


id seq1 = [Sequence actions: move, move_back, nil]; 
id seq2 = [Sequence actions: move_ease_in, move_ease_in_back, nil]; 
id seq3 = [Sequence actions: move_ease_out, move_ease_out_back, nil]; 


[grossini runAction: [RepeatForever actionWithAction:seq1]]; 
[tamara runAction: [RepeatForever actionWithAction:seq2]]; 
[kathia runAction: [RepeatForever actionWithAction:seq3]]; 
+0

这仍然是设计时......并且,我的问题很明显是关于动态和'在运行时'(即;在运行时确定的事情。 ..并且在设计时是未知的)。我的问题也提供了一个可能的解决方案,并简单地询问是否有更好的方法来做到这一点...... – 2009-06-23 03:16:35

+0

为什么不把你的信息保存在.plist中并动态加载序列? – slf 2009-06-24 18:00:15

0

我想看看使用NSInvocation的 - 你基本上可以建立一个使用你的目标的方法签名,然后使用setter方法,像这样每个对象:

NSInvocation *invoker = setup invoker here... 
for (int i = 0; i < actions.count; i++) 
{ 
    NSObject *arg = [actions objectatIndex:i]; 
    [invoker setArgument:&arg atIndex:i+2]; 
} 
[invoker setArgument:nil atIndex:i+2]; 

第i + 2位是因为前两个参数实际上是self和_cmd,因此您可以设置索引2和...中的所有内容...请阅读setArgument上的文档:atIndex:in NSInvocation以获取更多详细信息。

一旦你有,你可以调用目标的操作。我从来没有用变量参数方法来使用它,所以我不确定它在那里工作的效果如何,但它是我知道在运行时动态构造调用的唯一方法。

0

鉴于提供的选项,看来,真正的方法来完成我以后就是用我的问题,这是被提到的方法:

NSMutableArray *actions = [[NSMutableArray alloc] init]; 
[actions addObject: [DelayTime actionWithDuration:1]]; 
[actions addObject: [ScaleBy actionWithDuration:2 scale:4]; 

char *argList = (char *)malloc(sizeof(FiniteTimeAction *) * [actions count]); 
[actions getObjects:(id *)argList]; 

[self runActions: actions];