Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Azioni istantanee: posizione, flip, mostra e nascondi

Link copiato negli appunti

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:

Ti consigliamo anche