2009-06-23 56 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];