Mise en œuvre de la destruction de terrain comme Jeu de Terre brûlée sur iphone ou Java


Je cherche un exemple de la façon de mettre en œuvre la destruction de terrain 2D que vous voyez dans des jeux comme scorched earth ou sur l'iphone iShoot.

Je cherche à implémenter un jeu qui doit faire un terrain destructible et le rendre en utilisant OpenGL (LWJGL en Java) et en utilisant OpenGL ES sur l'iPhone.

Texte alternatif http://www.vintagecomputing.com/wp-content/images/shareware/scorch_3_large.png

Author: Dougnukem, 2009-05-09

2 answers

Si je me souviens bien, dans Worms, ils ont utilisé deux images; Le "joli" terrain en couleur, et un terrain masqué en noir et blanc pur. La détection des coups est toujours effectuée sur le masque.

Si vous voulez réellement que le terrain s'effondre comme dans Tank Wars, vous devrez parcourir chaque colonne de votre image et la faire rechercher des espaces entre le terrain et le bas du terrain de jeu. Si des lacunes sont détectées, déplacez le terrain au-dessus de l'écart vers le point le plus bas possible dans votre colonne.

Un exemple simple de ceci pourrait être fait avec un tableau où 1 représente un terrain solide et 0 représente un espace vide. Dans ce cas, j'ai configuré le côté gauche du tableau au niveau du sol, pour que l'élément {[3] } soit au sol:

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

Supposons que le terrain est frappé de côté et qu'un trou est fait:

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

Il vous reste maintenant un terrain flottant au-dessus d'un autre terrain. Pour réduire le terrain flottant, itérez sur le tableau, garder une trace de la première position que vous trouvez un 0 (espace vide). Ensuite, au fur et à mesure que vous continuez à itérer, lors de la découverte d'un 1 (terrain), déplacez simplement le 1 à l'endroit où se trouvait le 0. Répétez le processus à partir de l'ancienne position 0 + 1.

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

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

C'est l'approche de base, pas la plus efficace. Il serait beaucoup plus rapide de déplacer tous les indices de terrain au-dessus de l'écart en même temps, par exemple.

MODIFIER:

Comme l'indique le premier commentaire, a trier la liste est encore plus facile. Je garde ma réponse originale intacte car elle aide à expliquer le principe réel derrière l'effondrement du terrain.

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

La réponse de Soviut est géniale! J'utilise un algorithme similaire dans la fonction de terrain destructeur dans Scorched Earth pour iPhone . J'ai décidé de rester fidèle à l'original et de faire en sorte que le terrain s'installe instantanément, mais alors que j'envisageais d'avoir un terrain animé, j'ai rencontré des problèmes de performance. Vous pouvez également en voir la preuve dans iShoot, car iShoot utilise un terrain animé qui s'installe lentement. Il y a des situations où le sol est toujours en train de se régler à partir du tour d'un joueur lorsque le joueur suivant tire une arme. Cela peut interférer avec le tir, et l'interférence peut changer en fonction de la rapidité avec laquelle le joueur suivant tire. Étant donné que Scorched Earth est un jeu au tour par tour, il semble être une bonne idée d'avoir le jeu attendre que le sol est réglé jusqu'à ce que le passage au joueur suivant.

Pour rendre le terrain, j'ai utilisé OpenGL pour dessiner un polygone avec une paire de sommets à chaque emplacement d'écran horizontal, comme ceci:

1 3 5 7 9
0 2 4 6 8

Les points avec des nombres pairs représentent la ligne de pixels en bas de l'écran. Les points avec des nombres impairs représentent l'emplacement en pixels verticaux du terrain. Ces informations sont copiées dans un tableau de points, qui est rendu avec glVertexPointer, glColorPointer et glDrawArrays, sous forme de bande triangulaire, comme ceci:

// 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);

Les paramètres offsetX et offsetY permettent de repositionner le terrain par rapport à l'écran, ce qui permet au joueur de se déplacer dans l'environnement de manière interactive, tout en maintenant l'environnement de jeu comme un continuum enveloppant.

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