Queste azioni estendono l'azione CCActionInstant quindi hanno una durata di 0 secondi e servono per apportare modifiche repentine alla scena e agli sprite.
CCPlace
Con questa azione possiamo stabilire o modificare la posizione di un nodo, grazie alla proprietà position
.
CGPoint newPosition = ...;
CCPlace * place = [CCPlace actionWithPosition:newPosition];
CCNode * node = ...;
[node runAction:place];
CCFlipX e CCFlipY
CCFlipX serve a capovolgere in orizzontale il nodo su cui viene eseguita. Vediamo come applicarla al nostro progetto: vogliamo che ogni volta che l'utente tocchi con il dito lo sprite, esso venga capovolto in orizzontale.
Aprite il file Ball.m
aggiungete il seguente metodo:
- (void)applyFlipX
{
CCFlipX * flipX = [CCFlipX actionWithFlipX:YES];
[self runAction:flipX];
}
Aggiungete la dichiarazione del metodo al file Ball.h
@interface Ball : CCSprite {
}
+ (Ball*)ball;
- (void)moveForever;
- (void)applyFlipX;
@end
Ora aprite HelloWorldLayer.m
e modificate il metodo ccTouchBegan:withEvent: come segue:
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CCSprite * sprite = [self findSpriteFromTouch:touch];
if (sprite && [sprite isKindOfClass:Ball.class]) {
Ball * ball = (Ball*) sprite;
[ball applyFlipX];
}
return YES;
}
La prima riga, come succedeva in precedenza, recupera lo sprite su cui è stato eseguito il touch.
Il blocco IF verifica che la variabile sprite sia diversa da nil e referenzi un oggetto di tipo Ball
. Se è così effettua un cast di sprite a Ball
e invoca il metodo applyFlipX
.
Premiamo CMD+R
per testare il nuovo effetto nel simulatore. Effettuando un tap (click) sullo sprite, questo dovrebbe venire capovolto orizzontalmente. Ricordate che si tratta di un'azione istantanea quindi l'effetto è immediato e non viene presentato con un animazione.
Se provate nuovamente a cliccare noterete che lo sprite non ritorna alla configurazione originale! Per farlo è necessario modificare il metodo applyFlipX
di Ball.m
come segue.
- (void)applyFlipX
{
CCFlipX * flipX = [CCFlipX actionWithFlipX:!self.flipX];
[self runAction:flipX];
}
Semplicemente viene letta la proprietà flipX
dell'istanza corrente di Ball che indica se il nodo è già capovolto orizzontalmente. Il valore viene negato (con il “!”) e passato come parametro per costruire l'azione CCFlipX
.
Bisogna notare che per capovolgere orizzontalmente un nodo esiste un modo più semplice, basta invocare il metodo setFlipX
:. In questa lezione stiamo utilizzando la classe CCFlipX perché a volte può essere utile incapsulare un comando in un'azione.
La classe CCFlipY si comporta in modo analogo ma capovolge il nodo in verticale.
CCHide e CCShow
L'azione CCHide semplicemente nasconde il nodo su cui viene eseguita. L'effetto è simile a quello che si ottiene agendo direttamente sulla proprietà visible
di un nodo (CCNode
).
Ecco un esempio di come creare e applicare CCHide:
CCHide * hide = [CCHide action];
CCNode * node = ...;
[self runAction:hide];
In modo simile a quanto fatto in precedenza possiamo ottenere che lo sprite del nostro progetto scompaia quando viene toccato.
Aggiungete il metodo applyHide a Ball.m.
- (void)applyHide
{
CCHide * hide = [CCHide action];
[self runAction:hide];
}
Aggiungete la relativa dichiarazione a Ball.h
.
- (void)applyHide;
Infine in HelloWorldLayer.m
modificate il metodo ccTouchBegan:withEvent:
come segue:
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CCSprite * sprite = [self findSpriteFromTouch:touch];
if (sprite && [sprite isKindOfClass:Ball.class]) {
Ball * ball = (Ball*) sprite;
[ball applyHide];
}
return YES;
}
Premete CMD+R
e testate l'effetto nel simulatore, adesso lo sprite dovrebbe scomparire una volta toccato.
L'azione CCShow funziona in modo simile ma al contrario. In altre parole mostra i nodi nascosti.
L'azione CCToggleVisibility
Quest'azione permette di mostrare un nodo se questo è invisibile e lo nasconde se invece è attualmente visibile.
Il funzionamento è analogo a quello di CCHide
o CCShow
e può essere applicata con il seguente codice:
CCToggleVisibility * toggle = [CCToggleVisibility action];
CCNode * node = ...;
[node runAction:toggle];
Link utili
Per approfondire tutte le carattersitiche delle azioni è possibile consultare la documentazione ufficiale: