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

Animare uno sprite

Realizzare la prima animazione per muovere uno sprite in continuazione da sinistra a destra percorrendo tutta la larghezza dello schermo.
Realizzare la prima animazione per muovere uno sprite in continuazione da sinistra a destra percorrendo tutta la larghezza dello schermo.
Link copiato negli appunti

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.

Figura 23. Lo sprite esce dal lato sinistro dello schermo
Lo sprite esce dal lato 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);

Figura 24. Lo sprite è posizionato alla sinstra dello schermo
Lo sprite è posizionato alla sinstra dello schermo

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.

Figura 25. Lo sprite si muove sullo schermo
Lo sprite si muove sullo schermo

Ti consigliamo anche