Implementazione della distruzione del terreno come il gioco Terra bruciata su iPhone o Java


Sto cercando un esempio di come implementare la distruzione del terreno 2D che si vede in giochi come scorched earth o su iPhone iShoot .

Sto cercando di implementare un gioco che ha bisogno di fare terreno distruttibile e renderlo usando OpenGL (LWJGL in Java) e usando OpenGL ES su iPhone.

Testo Alt http://www.vintagecomputing.com/wp-content/images/shareware/scorch_3_large.png

Author: Dougnukem, 2009-05-09

2 answers

Come ricordo, in Worms hanno usato due immagini; Il terreno "carino" con il colore, e un terreno maschera che è puro bianco e nero. Hit rilevamento è sempre fatto sulla maschera.

Se vuoi davvero che il terreno collassi come nelle Guerre dei carri Armati, dovrai scorrere su ogni colonna della tua immagine e cercare spazi tra il terreno e il fondo del campo di gioco. Se vengono rilevati spazi vuoti, spostare il terreno sopra il divario fino al punto più basso possibile nel colonna.

Un semplice esempio di ciò potrebbe essere fatto con un array in cui 1 rappresenta il terreno solido e 0 rappresenta lo spazio vuoto. In questo caso, ho impostato il lato sinistro dell'array come livello del suolo, per l'elemento {[3] } sarebbe a terra:

[1,1,1,1,1,1,0,0,0,0]

Supponiamo che il terreno sia colpito di lato e che venga fatto un buco:

[1,1,0,0,1,1,0,0,0,0]

Ora ti rimane un pezzo di terreno galleggiante sopra un altro pezzo di terreno. Per far collassare il terreno galleggiante, scorrere l'array, tenendo traccia della prima posizione si trova uno 0 (spazio vuoto). Quindi, mentre continui a iterare, dopo aver scoperto un 1 (terreno), sposta semplicemente l ' 1 dove era lo 0. Ripeti il processo iterando da quella vecchia posizione 0 + 1.

[1,1,1,0,0,1,0,0,0,0]

[1,1,1,1,0,0,0,0,0,0]

Questo è l'approccio di base, non il più efficiente. Sarebbe molto più veloce spostare tutti gli indici del terreno sopra il divario allo stesso tempo, per esempio.

MODIFICA:

Come afferma il primo commento, un ordinare sulla lista è ancora più facile. Sto mantenendo intatta la mia risposta originale poiché aiuta a spiegare il principio reale dietro il terreno collassante.

 7
Author: Soviut, 2009-05-09 19:53:19

La risposta di Soviut è fantastica! Io uso un algoritmo simile nella funzione terreno distruttivo in Terra bruciata per iPhone . Ho deciso di rimanere fedele all'originale e di sistemare il terreno all'istante, ma mentre stavo pensando di avere un assestamento del terreno animato, mi sono imbattuto in alcuni problemi di prestazioni. Si può vedere la prova di questo in iShoot pure, dal momento che iShoot utilizza un terreno animato lentamente assestamento. Ci sono situazioni in cui il terreno si sta ancora stabilendo dal turno di un giocatore quando il giocatore successivo spara un'arma. Questo può interferire con il tiro e l'interferenza può cambiare a seconda di quanto velocemente il giocatore successivo spara. Dal momento che Scorched Earth è un gioco a turni, sembra una buona idea per avere il gioco aspettare fino a quando il terreno è risolta fino al passaggio al giocatore successivo.

Per rendere il terreno, ho usato OpenGL per disegnare un poligono con una coppia di vertici in ogni posizione orizzontale dello schermo, in questo modo:

1 3 5 7 9
0 2 4 6 8

I punti con numeri pari rappresentano la linea di pixel nella parte inferiore dello schermo. I punti con numeri dispari rappresentano la posizione verticale dei pixel del terreno. Queste informazioni vengono copiate in un array di punti, che viene reso con glVertexPointer, glColorPointer e glDrawArrays, come una striscia triangolare, in questo modo:

// prepare vertex buffer
for (int i=0,j,k=0,K=480;k<=K;k++) {
    j = (k-(int)offsetX+480)%480;
    vGroundLevel[i++] = k;
    vGroundLevel[i++] = offsetY>0 ? 0 : offsetY;
    vGroundLevel[i++] = k;
    vGroundLevel[i++] = [env groundLevelAtIndex:j]+offsetY;
}
....
// render vertex buffer
glVertexPointer(2, GL_FLOAT, 0, vGroundLevel);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cGround);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 2*480);

I parametri offsetX e offsetY consentono di riposizionare il terreno rispetto allo schermo, consentendo al giocatore di muoversi nell'ambiente in modo interattivo, mantenendo l'ambiente di gioco come un continuum avvolgente.

 2
Author: Aubrey Goodman, 2011-08-25 17:29:36