2011-10-18 13 views
11

Ok quindi sto facendo un gioco con figure stilizzate con cocos2d nell'obiettivo ... Le cose diverse devono essere animate quindi, per favore, dammi un suggerimento su quale sarebbe il modo migliore per realizzare il movimento per queste cose :Spostare una figura stilizzata, punti di ancoraggio, animazione o qualcos'altro ...?

  1. la caratteri- principale che è un arciere nell'angolo in basso a sinistra che non si muove in giro, a meno che si muoverà la sua parte superiore del corpo perché è necessario per cambiare l'angolo di dove si sta riprendendo l'angolo ..

  2. I nemici - orde di figure stilizzate che arrivano a voi che hanno rilevato collisione e muoiono quando vengono colpiti da una freccia sprite.

Come devo spostare 1 e 2? devo padroneggiare i punti di ancoraggio e usarli? (Odio davvero stupidi punti di ancoraggio sono così difficili da lavorare ... ma li userò se sono migliori) o fare tonnellate di animazioni, o c'è un altro modo più semplice per combinare molti sprite in un singolo movimento?

risposta

44

Il mio consiglio generale: mai e poi mai modificare il punto di ancoraggio predefinito (0.5f, 0.5f) a meno che tu non abbia una buona comprensione di ciò che fa e di come ti aiuta a realizzare le cose. In tutti gli altri casi, modificare la proprietà position.

Specialmente se si esegue il rilevamento della collisione limite o del limite di rotazione, la modifica del punto di ancoraggio è controproducente.

Supponiamo vostra immagine sprite rettangolare utilizza un punto di ancoraggio di default, che è al centro della trama:

._______. 
|  | 
|  | 
| * | 
|  | 
|  | 
°-------° 

Il * segna l'AnchorPoint della texture. Se si posiziona questo sprite in posizione (250, 100), il punto di ancoraggio dello sprite si troverà sulle coordinate (250, 100).

Diciamo che si sposta l'AnchorPoint a (0.1f, 0.1f):

._______. 
    |  | 
. |  . | 
    |  | 
    |  | 
    | *  | 
    °-------° 

°  ° 

La posizione dello sprite rimane invariato a (250, 100). Anche la posizione del punto di ancoraggio non cambia. Ciò che cambia è come la trama è centrata attorno a quel punto. Puoi vedere la posizione dell'immagine precedente prima di modificare il punto di ancoraggio osservando i punti fluttuanti. In effetti, tutto ciò che si fa modificando il punto di ancoraggio è lo spostamento (offset) in cui la trama del nodo viene disegnata rispetto alla posizione del nodo.

Nel caso precedente la trama è ora centrata con l'angolo inferiore sinistro sopra la posizione del nodo. Non puoi più fare affidamento sulla posizione dello sprite che segna il centro dell'immagine sprite. Se si modifica arbitrariamente il punto di ancoraggio per ogni nodo del gioco, non si ha più alcuna correlazione tra la rappresentazione visiva di un nodo e la sua posizione. Pertanto è un cattivo progetto modificare l'anchorPoint per gli oggetti di gioco.

Inoltre, la rotazione o il ridimensionamento saranno sempre centrati sul punto di ancoraggio. La modifica del punto di ancoraggio può comportare un comportamento indesiderato durante la rotazione o il ridimensionamento dei nodi.

Ipotizziamo un, caso peggiore strano, ma del tutto possibile scenario in cui l'AnchorPoint non è più all'interno della trama è:

     ._______. 
        |  | 
        |  | 
        |  | 
    *     |  | 
        |  | 
        °-------° 

Ciò significa che la posizione di tale sprite è compensato molto più a sinistra di dove l'attuale l'immagine viene visualizzata. Ciò può portare a discrepanze nei controlli di collisione, in particolare la situazione di cui sopra annullerebbe completamente i controlli di collisione basati su raggi. Questa è anche una situazione confusionaria durante lo sviluppo.

Il gioco sarà molto più facile da sviluppare se si può essere sicuri che la posizione di uno sprite sia sempre al centro della trama, piuttosto che un punto arbitrario che non si può nemmeno vedere senza l'aiuto di alcuni disegni di debug.

La domanda rimane:

Quando si vorrebbe modificare il punto di ancoraggio?

ho fatto in modo che solo nelle seguenti situazioni, ed evitare in tutti gli altri scenari:

  1. per allineare le texture non animati con i bordi dello schermo/finestra o simili
  2. a destra/left/top/bottom allineare un'etichetta, un pulsante o un'immagine
  3. per allineare un'immagine modificata (es. aggiornamento artista) senza modificare la posizione del nodo.

1) È facile da spiegare. Supponi di avere un'immagine di sfondo a schermo intero. Per rendere più coprire l'intero schermo, si può fare una delle due cose:

  • cambiare la posizione di: (larghezza dello schermo/2, schermo altezza/2)
  • cambiamento del AnchorPoint a (0, 0) alias CGPointZero

Si può immaginare che quest'ultimo è più facile da fare. Se non cambierai mai lo sfondo, va bene. Tuttavia per uno sfondo a scorrimento non cambierei il punto di ancoraggio.

2) Si supponga che il sistema di menu richieda che vari pulsanti e immagini siano allineati a destra esattamente con il bordo destro dello schermo. Tutti i pulsanti e le immagini differiscono in larghezza: ad es. Play Game, Crediti, Impostazioni, Altri giochi fantastici!

Invece di individuare le singole posizioni per ogni immagine/pulsante, è più semplice semplicemente allineare a destra modificando il punto di ancoraggio su (1,0f, 0,5f) e quindi posizionare le immagini/pulsanti esattamente alla larghezza dello schermo (e altezza dello schermo variabile): posizione = (larghezza schermo, 100).

Supponiamo che la posizione dell'immagine seguente sia a (larghezza schermo, altezza schermo/2) con un punto di ancoraggio predefinito (0,5f, 0,5f). Si può vedere la metà destra dell'immagine è al di fuori dell'area dello schermo:

__________. 
      | 
     .___|___. 
     | | | 
     | | | 
     | * | 
     | | | 
     | | | 
     °---|---° 
      | 
----------° 

Con un'AnchorPoint modificata (1.0f, 0.5f) l'immagine può essere ordinatamente allineato a destra con il bordo destro dello schermo/finestra, indipendentemente dalla larghezza della sua trama. La posizione rimane la stessa: (larghezza schermo, altezza schermo/2).

__________. 
      | 
    ._______. 
    |  | 
    |  | 
    |  * 
    |  | 
    |  | 
    °-------° 
      | 
----------° 

Proprio per il confronto, se si voleva destra-align questa immagine, tasto menu, o l'etichetta senza modificare l'AnchorPoint, si dovrà impostare la sua posizione secondo questa formula:

(screen width - contentSize.width * anchorPoint.x, screen height/2) 

La formula è ancora piuttosto semplice, ma diventa un lavoro di routine se il contentSize del nodo cambia, come accade spesso per le etichette, ad esempio il punteggio inizia con 1 cifra ma aumenta a 2, 3 e 4 cifre nel tempo. In questi casi, allineare a destra un nodo modificando il punto di ancoraggio è giustificato perché evita di dover ricalcolare la posizione ogni volta che cambia il contenuto del nodo.

3) Ci sono rari casi in cui un artista mi ha fornito un'immagine aggiornata di un oggetto di gioco. La dimensione dell'immagine è cambiata, quindi non si adatta più naturalmente alla grafica del gioco. D'altra parte, la posizione dell'oggetto è già stata ben stabilita attraverso i test di gioco e non dovrebbe essere modificata per evitare di ripetere il test del gioco.

In tal caso, modificare l'ancoraggio in modo che la nuova immagine si allinea bene con l'altra grafica, senza influire sul gameplay, è giustificata. Questa è una modifica sicura, dell'ultimo minuto. Non iniziare a farlo durante la fase di produzione o finirai con l'anchorPoint-tweaking-hell per tutta la durata del tuo progetto. Non andare lì!

In sintesi:

Modifica AnchorPoint solo se che rende più facile allineare i nodi con altri nodi o un bordo dello schermo/finestra, o per mettere a punto l'arte finale senza influenzare il gioco.

In tutti gli altri casi, utilizzare la posizione esclusivamente per spostare i nodi.

+0

Diciamo che stavo collegando due piccole linee così _ e/per fare una sorta di braccio ... con un gomito in modo che il braccio possa muoversi. Quindi sembra _ /. Pensi che impostare il punto di ancoraggio per/a ccp (0.5f, 0.0f) possa causare problemi? Voglio dire, sembra che funzioni ... ma hai qualche input su questo argomento :) – Gabe

+3

@Gabe: l'esempio del braccio ha senso perché la rotazione è centrata attorno al punto di ancoraggio, quindi spostare il punto di ancoraggio in questo caso ti consente di ottenere la rotazione all'articolazione del gomito. Per i disegni più complessi utilizzerei un oggetto CCNode come l'articolazione del gomito e aggiungo il braccio inferiore all'articolazione del gomito in un offset. Ciò consente di ruotare il nodo dell'articolazione a gomito e offre una maggiore flessibilità. In particolare se ogni arto dovrebbe fare i propri test di collisione per aggiungere tali "nodi congiunti". – LearnCocos2D

+1

Oltre a un commento a parte, a meno che non si abbia la prova che le persone pubblicano spam o non risposte a una determinata domanda, preferiamo non proteggere preventivamente le domande. Possiamo proteggerli una volta che iniziano a diventare un problema, ma non vogliamo impedire inutilmente ai nuovi utenti di rispondere anche a domande più vecchie. –

Problemi correlati