Un videogioco basato su cocos2d-iPhone è rappresentato da un albero di nodi. Ogni nodo è un oggetto di tipo CCNode (o di una sua sottoclasse). Qualsiasi cosa che venga disegnata o che contenga altri elementi è di tipo CCNode.
Esistono varie sottoclassi di CCNode tra cui CCScene, CCLayer, CCSprite e CCMenu. Le caratteristiche principali di CCNode sono le seguenti:
- ogni CCNode può avere un numero variabile di CCNode figli;
- ogni CCNode permette di impostare l'esecuzione periodica di un metodo;
- ogni CCNode può eseguire delle azioni.
Un nodo può essere creato usando l'apposito metodo di classe:
CCNode * node = [CCNode node];
Proprietà di CCNode
Tra le proprietà di CCNode troviamo:
Proprietà | Descrizione |
---|---|
position | contiene una struttura CGPoint che determina la posizione del nodo rispetto al suo nodo padre |
scale | un float che rappresenta il fattore di scala del nodo, il valore di default è 1 |
rotation | l'angolo di rotazione rappresentato in gradi |
anchorPoint | è il punto di rifermento per le operazioni di trasformazione e posizionamento. È normalizzato quindi il punto (0,0) rappresenta l'angolo in basso a sinistra del nodo, mentre (1,1) rappresenta quello in alto a destra |
contentSize | rappresenta la dimensione del nodo, rimane la stessa quando viene scalato o rotato. Nei nodi di tipo CCScene o CCLayer il contentSize equivale alla dimensione dello schermo |
visibile | è un valore di tipo BOOL che determina la visibilità sullo schermo del nodo |
z-order | rappresenta l'ordine con cui deve essere disegnato un nodo rispetto ai suo fratelli. I nodi con z-order minore verrano disegnati prima. Quindi un modo per assicurare che un nodo A venga disegnato sopra un nodo B è quello di assegnare al nodo A uno z-order maggiore |
tag | un intero non negativo che potete usare per identificare il nodo. Non siete obbligati a fare uso dei tag, ma se decidete di farlo, per avere un comportamento deterministico non dovreste assegnare lo stesso tag a 2 nodi fratelli (ovvero 2 nodi che hanno lo stesso nodo padre) |
La prima regola è che la radice dell'albero del videogioco deve essere un nodo speciale di tipo CCScene
(che appunto estende CCNode
).
L'albero di un personaggio
La potenza di questo meccanismo sta nel fatto che le alcune operazioni effettuate su un nodo saranno automaticamente applicate anche a tutti i nodi del suo sottoalbero.
Questo vale ad esempio per le trasformazioni geometriche: se traslate le coordinate di un nodo, automaticamente la stessa traslazione verrà applicata a tutti i nodi sottostanti.
Questa funzione risulta particolarmente utile nel caso di oggetti composti da più sprite.
Non conosco il codice sorgente di Street Fighter 2 scritto da Capcom oltre vent'anni fa, tuttavia se dovessi progettare un personaggio di Street Fighter 2 con cocos2d lo organizzerei in modo da avere tutti gli sprite che formano il corpo (braccio sx, braccio dx, gambe, torace, testa) figli di uno stesso nodo.
In questo modo gestire il movimento del personaggio sarebbe semplice, per spostare l'intero personaggio basterebbe muovere il nodo Ken
e automaticamente tutti i nodi figli verrebbero spostati di conseguenza. Inoltre sarebbe possibile animare soltanto la testa (o un braccio o le gambe) andando a modificare la posizione di uno di questi nodi figli.
Notate che il nodo Ken
è di tipo CCNode
e non ha una rappresentazione grafica. In questo esempio lo stiamo utilizzando soltanto per poter raggruppare i 5 CCSprite sotto un nodo comune.
Questo discorso relativo alla traslazione vale anche per la rotazione o per la modifica delle dimensioni. Inoltre se decidiamo di rimuovere dalla scena un nodo, automaticamente tutti i nodi sotto di lui verranno eliminati (e cocos2d penserà a liberare le risorse occupate da questi oggetti). Questo è particolarmente comodo se vogliamo eliminare dalla scena un oggetto complesso composto da più nodi, basterà eliminare il nodo padre e automaticamente tutte le componenti del personaggio verranno rimosse correttamente.