32 votes

Le moyen le plus efficace de sauvegarder les données de tuiles d'un jeu isométrique

Je suis en train de travailler sur un jeu isométrique pour rapide les navigateurs qui supportent <canvas>, ce qui est très amusant. Pour enregistrer les informations de chaque tuile, j'utilise un tableau à deux dimensions qui contient des nombres représentant de la tuile de l'IDs, comme:

var level = [[1, 1, 1, 2, 1, 0],
             [0, 1, 1, 2, 0, 1],
             [0, 1, 1, 2, 1, 1]];

var tiles = [
    {name: 'grass',  color: 'green'},
    {name: 'water',  color: 'blue'},
    {name: 'forest', color: 'ForestGreen'}
];

Jusqu'à présent, il fonctionne très bien, mais maintenant, je veux travailler avec des hauteurs et des pentes comme dans cette image: alt text

Pour chaque tuile, j'ai besoin d'enregistrer la vignette de l'ID, la hauteur, et des informations sur les coins sont tournés vers le haut.

Je suis venu avec une idée simple sur un bit à bit de la représentation de tous les quatre coins, comme ceci:

1011 // top, bottom and left corner turned up

Ma question est: quel est le moyen le plus efficace pour sauver ces trois valeurs pour chaque cellule? Est-il possible de sauvegarder ces trois valeurs comme un entier?

14voto

Yacoby Points 29771

Si vous essayez de faire quelque chose comme l'image que vous n'avez pas besoin de stocker des coins qui sont en haut/en bas, car il peut être déduit du carrelage.

Par exemple, si la tuile courante est la hauteur n et la hauteur de la tuile de la tuile courante est la hauteur n+1 alors que le courant de la tuile doit avoir "haut coin"

Super! Merci!!!! Je vais essayer de le mettre en œuvre. Encore une pensée pour compléter votre réponse: est-il possible de stocker de la hauteur et de la tuile de l'ID d'un nombre entier?

Oui. Vous aurez besoin d'utiliser des Opérations bit à Bit.

Si vous avez divisé le nombre entier de manière égale entre la hauteur et l'id en utilisant le premier 16 bits pour la taille, et le reste de l'id

var id = tile & 0x0000FFFF; //mask the first 16 bits
var height = tile >>> 16; //shift the first 16 bits to the right

Le réglage peut être fait de la même mannar

tile &= 0xFFFF0000; //remove id bits
tile |= id; //set new id

tile &= 0x0000FFFF; //remove height bits
tile |= (height << 16);

3voto

Alex Gyoshev Points 6714

Oui, vous pouvez:

 var corners = 11; // binary 1011;
var topCornerUp = corners & 0x8;
var bottomCornerUp = corners & 0x2;
 

Cependant, si vous souhaitez l'optimiser, considérez ce que Yacoby a dit : vous pouvez stocker un tableau des angles au lieu de les enregistrer séparément pour chaque mosaïque.

0voto

Andreas Bonini Points 15709

Si la hauteur est dans la plage [0, 255], vous pouvez enregistrer 4 hauteurs dans un seul entier en utilisant la manipulation de bits. En hex:

0xAABBCCDD, AA = première hauteur, BB = seconde, etc.

Pour obtenir la hauteur la plus à gauche, vous feriez ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF , qui renvoie 170 (0xAA).

Pour le définir: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

0voto

Matthew Dresser Points 4466

La zone est-elle rectangulaire? Si c'est le cas, vous pouvez simplement stocker la largeur et la hauteur de la surface, la longueur de la mosaïque et un tableau d'entiers représentant les hauteurs des sommets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X