cocos2d fornisce un'ampia lista di azioni per eseguire tanti tipi di animazioni su oggetti di tipo CCNode
. Siccome la nostra classe Ball
estende CCSprite
che a sua volte estende CCNode potremo utilizzare queste azioni per animare il nostro sprite!
In seguito esamineremo in dettaglio le varie animazioni possibili, nel frattempo vediamo come usarne alcune per fare in modo che lo sprite si muova in continuazione da sinistra a destra percorrendo tutta la larghezza dello schermo.
Prima di tutto facciamo in modo che all'avvio lo sprite Ball
si trovi sul bordo sinistro dello schermo.
Esaminiamo il metodo init
di HelloWorldLayer
. Potremmo modificare la riga in cui viene impostata la posizione da così:
ball.position = ccp(screenSize.width/2 , screenSize.height/2);
a così:
ball.position = ccp(0 , screenSize.height/2);
Tuttavia in questo modo lo sprite uscirebbe dal bordo sinistro dello schermo.
Quindi impostiamo la sua coordinata x
pari alla metà della sua larghezza.
ball.position = ccp(ball.contentSize.width/2 , screenSize.height/2);
Ora vogliamo aggiungere alla classe Ball
un metodo che sposti lo sprite da sinistra verso destra (e poi da destra verso sinistra) all'infinito.
Inserite questo metodo in Ball.m.
- (void)moveForever
{
// 1 - ottiene dimensione dello schermo e le posizoni da raggiungere verso destra e versosinistra
CGSize screenSize = [[CCDirector sharedDirector] winSize];
CGPoint rightPosition = ccp(screenSize.width - self.contentSize.width/2, screenSize.height/2);
CGPoint leftPosition = ccp(self.contentSize.width/2 , screenSize.height/2);
// 2 - la durata dello spostamento da un lato all'altro
ccTime actionDuration = 2;
// 3 - creazione di una action per spostare un nodo verso destra
CCMoveTo * goRight = [CCMoveTo actionWithDuration:actionDuration position:rightPosition];
// 4 - creazione di una action per spostare un nodo verso sinistra
CCMoveTo * goLeft = [CCMoveTo actionWithDuration:actionDuration position:leftPosition];
// 5 - creazione una action che esegue in successione le action goRight e poi goLeft
CCSequence * sequence = [CCSequence actionOne:goRight two:goLeft];
// 6 - creazione di una action che esegua per sempre la action sequence
CCRepeatForever * repeatForever = [CCRepeatForever actionWithAction:sequence];
// 7 - esecuzione della action repeatForever
[self runAction:repeatForever];
}
Il primo blocco ottiene la dimensione dello schermo, la posizione che dovrà raggiungere lo sprite sul latro destro e infine quella che dovrà raggiungere tornando sul lato sinistro.
Il secondo blocco definisce una variabile corrispondente al numero di secondi che verranno impiegati per spostare lo sprite da un lato all'altro (siete liberi di modificarne il valore a piacimento!).
Il terzo blocco crea una action. Una action, ricordiamo, può essere eseguita su un oggetto di CCNode
(quindi Ball
è un buon candidato) per animarlo. In particolare questa action si occuperà di spostare lo sprite verso la posizione rightPosition
corrispondente al bordo destro dello schermo.
Il quarto blocco è analogo e porterà lo sprite verso il bordo sinistro.
Il quinto blocco crea una action particolare perché composta della sequenza di altre 2 action (nel nostro caso goRight + goLeft
). Questa action provvederà a eseguire prima goRight
e poi goLeft
.
Nel sesto blocco viene creata una action di tipo CCRepeatForever
, questa action si limita a ripetere all'infinito la action che riceve come parametro durante la sua creazione. Questo significa che questa action ripeterà all'infinito la action sequence creata in precedenza.
Infine nel settimo blocco viene eseguita la action repeatForever
sull'oggetto ball
.
Questo metodo mostra la potenza delle action in cocos2d e di come sia possibile usarle in combinazione per creare effetti complessi.
Aggiungete la dichiarazione nel metodo a Ball.h
.
Poi aggiungete l'invocazione a questo metodo nel 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];
[self moveForever:ball];
}
return self;
}
CMD+R
per compilare e avviare il gioco nel simulatore. Ora dovremmo vedere lo sprite muoversi in continuazione da un lato all'altro dello schermo.