Domanda

Voglio fare giochi isometrici, basati su piastrelle, iPhone con COCOS2D.

Sprite devono essere disegnati in cima agli altri spriti che sono "dietro". Sto cercando il modo migliore per farlo.

Mi piacerebbe evitare l'algoritmo del pittore perché prevede di ordinare tutti gli sprite ogni cornice costosa.

L'algoritmo del buffer Z è supportato dalla GPU e dal Cocos2D, quindi questo è quello che mi piacerebbe usare, ma c'è un problema. Alcuni sprites, come gli edifici, per esempio, occupano più piastrelle. L'assegnazione di un valore Z a tali sprite è difficile.

Queste sono le opzioni a cui ho pensato:

    .
  1. confrontando due edifici e determinare quale è "in-front" è facile. Quindi gli edifici possono essere ordinati quindi assegnato un valore Z in base a l'ordinamento. Questo non sarebbe diverso dal pittore algoritmo. Il buffer OpenGL ES Z non sarebbe necessario.
  2. Assegna un valore z a ciascun edificio basato esclusivamente sulla sua posizione La mappa (senza conoscenza di dove sono altri edifici). io sono Trovando questo difficile. Penso che sia possibile, ma non sono stato in grado di trovare ancora una formula.
  3. Utilizzare più sprite per le immagini che occupano più di una tessera, quindi Tutti gli spriti saranno esattamente le stesse dimensioni. Gli ordini Z possono quindi essere Assegnato facilmente in base a quale tessera lo sprite occupa. Il Problema con questa soluzione è che rende la logica del gioco molto di più complicato. Tutte le operazioni su un singolo edificio dovranno essere Ripetuto per ogni sprite che l'edificio è inventato. mi piacerebbe Tratta ogni oggetto come un'unica entità.
  4. Modifica il codice COCOS2D per consentire agli sprificati di avere più valori Z in punti diversi. Se uno sprite può avere più valori Z in base a in che tessera una parte particolare del sprite cade, quindi calcolando Un valore Z per quella sezione è facile. Non avrò bisogno di confrontare il Sprite a qualsiasi altro sprificato. Credo che questo sia possibile usando Quad multipli per ogni sprite. Il problema con questo è che è Un po 'complicato per me da quando sono nuovo a OpenGL ES e COCOS2D. io Non capire completamente come tutte le strutture dati interne opera. Anche se sembra la soluzione più elegante se una formula non può essere trovato.

    Vota i suggerimenti o i riferimenti a risorse utili.

È stato utile?

Soluzione

Per # 2, è possibile calcolare la distanza di Manhattan del centro dell'oggetto e utilizzare questo valore come valore Z di quell'oggetto.Lavorerà finché si eviterà oggetti molto lunghi nella tua mappa come oggetto 5x1 o peggio.Ma se hai davvero bisogno di un oggetto lungo da inserire in una mappa piastrellata, gestendo l'ordine Z degli oggetti nella mappa impostando un valore Z usando una formula è impossibile.

Per dimostrare questo:
1.) Posizionare due oggetti 2x2 in una mappa orizzontalmente e lasciare una piastrella unitario tra di loro.
. 2.) Posizionare un oggetto 3x1 tra di loro.Nomettiamo gli oggetti 2x2 a A e B e l'oggetto 3x1 a C.
3.) Se rimuovi solo C (non modificando la sua posizione), Z-Order di A e B InterChange.

-----d b è ora di fronte, alcuni oggetti dietro B saranno di fronte a a a causa della giusta rotazione di C. ed è costoso sapere quali oggetti nella parte posteriore di entrambi A e B in precedenza diventano di fronte a adopo la rotazione di C.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top