Possiamo applicare ai nodi una notevole lista di azioni, fornite dal cocos2d per modificarne le proprietà (es: posizione, dimensione, rotazione, colore, etc...). In precedenza ne abbiamo usate alcune per muovere uno sprite. In questa sezione ne esamineremo alcune con maggior dettaglio.
Ogni classe che rappresenta un'azione estende (direttamente o indirettamente) la classe CCAction
.
Quelle che estendono direttamente CCAction
sono le seguenti:
- CCFollow
- CCRepeatForever
- CCSpeed
- CCFiniteTimeAction
L'azione CCFollow
Quest'azione permette di indicare ad un nodo di seguirne un'altro. È particolarmente utile nel caso in cui si voglia simulare una telecamera virtuale che segua un certo nodo (come il protagonista del gioco) e faccia scorrere il gioco di conseguenza (situazione tipica ad esempio dei platform).
- (void)followSprite:(CCSprite*)sprite
{
CCFollow * followAction = [CCFollow actionWithTarget:sprite];
[self runAction:followAction];
}
Il metodo qui sopra si occupa di creare un'azione di tipo CCFollow
. Nella prima riga la action viene creata invocando il metodo di classe actionWithTarget a cui bisogna passare il nodo che vogliamo venga seguito.
La seconda riga esegue l'azione sull'oggetto self
. Poiché aggiungerete questo metodo a HelloWorldLayer.m
(inseritelo prima dell'istruzione @end
), self
indica il layer che contiene gli oggetti del nostro gioco.
Potete ora provare a invocare il metodo aggiungendo la seguente chiamata alla fine del metodo init
di HelloWorldLayer.m
.
- (id)init
{
if (self = [super init]) {
Ball * ball = [Ball ball];
CGSize screenSize = [[CCDirector sharedDirector] winSize];
ball.position = ccp(ball.contentSize.width/2 , screenSize.height/2);
[self addChild:ball];
[ball moveForever];
[self beginTouchDetection];
[self followSprite:ball];
}
return self;
}
Il parametro passato è l'oggetto Ball
, quindi la telecamera virtuale dovrebbe seguire il movimento del nostro sprite mentre si muove da destra a sinistra sullo schermo. Compilate ed eseguite con CMD+R
e osservate l'effetto.
Stranamente lo sprite ora appare immobile al centro dello schermo. In realtà si sta muovendo e la telecamera virtuale lo sta seguendo perfettamente, per questo sembra immobile. Se volete potete aggiungete altri sprite statici al layer e la sensazione di movimento sarà più chiara.
Prima di passare al paragrafo successivo commentate la chiamata a followSprite
: nel metodo init
.
L'azione CCRepeatForever
CCRepeatForever viene definita prendendo come parametro un'altra azione e la ripete all'infinito (Abbiamo già utilizzato quest'azione e abbiamo visto che il loop può contenere a sua volta altre azioni). Potete crearla con la seguente riga di codice:
CCActionInterval * action = ...;
CCRepeatForever * repeatForever = [CCRepeatForever actionWithAction:action];
La condizione è che l'azione da ripetere, ovvero il parametro da passare al metodo actionWithAction
, sia di tipo CCActionInterval
. Si tratta di un tipo specifico di CCAction che vedremo in seguito.
Infine potete eseguirla su un qualsiasi oggetto di tipo CCNode
.
[node runAction:repeatForever];
L'azione CCSpeed
Quest'azione viene costruita prendendo come parametro un'altra azione e permette di controllarne la velocità mentre è in esecuzione.
CCActionInterval * actionInterval = ...;
CCSpeed * speed = [CCSpeed actionWithAction:actionInterval speed:1.0];
CCNode * node = ...;
[node runAction:speed];
La seconda riga di questo snippet crea un'azione di tipo CCSpeed
prendendo come parametro una qualche azione di tipo CCActionInterval
. Poi imposta la velocità di esecuzione pari a 1.0 (ovvero la velocità di default).
La quarta riga esegue l'azione speed su un oggetto di tipo CCNode
.
Successivamente sarà possibile modificare la velocità di esecuzione di actionInterval
semplicemente agendo sull'oggetto speed
. Il seguente codice, ad esempio, permette di raddoppiare la velocità di esecuzione:
[speed setSpeed:2.0f];
Le azioni di tipo CCFiniteAction
Questa è la quarta e ultima classe che estende direttamente CCAction
e rappresenta le azioni che hanno una durata temporale finita. A sua volta viene estesa da 2 classi:
- CCActionInstant: rappresenta quelle azioni con durata pari a 0 secondi e quindi che terminano istantaneamente.
- CCActionInterval: rappresenta quelle azioni che hanno una durata maggiore di 0 secondi e non infinita.
Link utili
Per approfondire tutte le carattersitiche delle azioni è possibile consultare la documentazione ufficiale:
Inoltre è disponibile un diagramma di ereditarietà che fornisce una panoramica delle azioni disponibili.