1

Cocos2D は、Sequence クラスの静的メソッド 'actions' を次のように定義します。

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

おそらくディスクファイルなどから読み取るなど、実行時に実行するアクションのリストを作成するにはどうすればよいですか?

可変長引数リストを (char *) に変換して、そのように渡すことができると読みました...

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];

これは、これを行うための「最善の方法」または「正しい」方法ですか? 彼らのより良い代替手段、より速い代替手段はありますか?

4

4 に答える 4

2

Sequencevaargsは、ネストされたオブジェクトを構築するための単なるヘルパーです。FiniteTimeAction*への連続した呼び出しによって構築されたaを返します[Sequence actionOne:one_ two:two_]。セットまたは配列をループすることにより、コードでこれを自分で行うことができます。次のようになります。

FiniteTimeAction *seq = nil;
for (FiniteTimeAction *action in actions) {
    if (!seq) {
        seq = action;
    } else {
        seq = [Sequence actionOne:seq two:action];
    }
}
[self runActions:seq];
于 2009-09-02T16:58:46.560 に答える
0

私は NSInvocation の使用を検討します。基本的には、対象とするメソッド シグネチャを使用してビルドし、次のように各オブジェクトのセッターを使用できます。

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 ビットは、最初の 2 つの引数が実際には self と _cmd であるため、インデックス 2 以降のすべてを設定するためです。詳細については、NSInvocation の setArgument:atIndex: に関するドキュメントを参照してください。

それができたら、ターゲットを指定して操作を呼び出すことができます。私はこれを可変引数メソッドで使用したことがないので、そこでどのように機能するかはわかりませんが、実行時に呼び出しを動的に構築する唯一の手段です。

于 2009-06-23T16:37:03.217 に答える
-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]];
于 2009-06-23T02:18:04.697 に答える