2009-06-23 7 views
1

Cocos2D définit la méthode statique des « actions » pour la classe de séquence en tant que tel:Run-Time Actions de longueur dynamique liste pour la séquence

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

Comment pourrais-je construire une liste d'actions à effectuer au moment de l'exécution, peut-être lire à partir d'un fichier disque ou tel?

Je lis que la liste des arguments de longueur variable peut être traduit en un (char *) et passé de cette façon ...

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

Est-ce la « meilleure façon » ou « correct » à fais ça? Sont leurs meilleures alternatives, des alternatives plus rapides?

Répondre

2

Le vaargs est juste une aide pour construire des objets imbriqués Sequence. Il renvoie un FiniteTimeAction* qui est construit par des appels successifs à [Sequence actionOne:one_ two:two_]. Vous pouvez le faire vous-même dans votre code en bouclant votre ensemble ou votre tableau. Cela devrait aller quelque chose comme ceci:

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

Cela semble être une approche parfaite. –

-1

Peut-être un ensemble de séquences pré-construites?

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

Ceci est encore au moment de la conception ... et, ma question était assez claire sur le fait d'être dynamique et «au moment de l'exécution» (c'est-à-dire quelque chose qui est déterminé à l'exécution. .. et est inconnu au moment de la conception). Ma question fournit également une solution possible et demande simplement s'il y a une meilleure façon de le faire ... –

+0

Pourquoi ne pas simplement conserver vos informations dans un .plist et charger la séquence dynamiquement? – slf

0

je chercherais à l'aide NSInvocation - vous pouvez essentiellement construire un en utilisant la signature de la méthode que vous ciblez, puis utilisez les setters pour chaque objet comme ceci:

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

Le i + 2 bits est parce que les deux premiers arguments sont vraiment self et _cmd, donc vous définissez tout de l'index 2 et sur ... lisez les docs sur setArgument: atIndex: dans NSInvocation pour plus de détails.

Une fois que vous avez cela, vous pouvez appeler l'opération avec une cible. Je n'ai jamais utilisé cela avec des méthodes d'argument variable, donc je ne sais pas comment cela fonctionne bien, mais c'est le seul moyen que je connaisse pour construire dynamiquement un appel à l'exécution.

0

Compte tenu des options fournies, il semble que la seule façon d'accomplir ce que je cherchais est d'utiliser l'approche je l'ai mentionné dans la question, qui est était:

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