Je cherchais une formule pour tracer (monde-> écran) et choisir des tuiles isométriques (monde-> écran) dans un monde en forme de diamant. Ceux que j'ai essayés semblent toujours éteints. Quelle est la manière habituelle / correcte de procéder?
Je cherchais une formule pour tracer (monde-> écran) et choisir des tuiles isométriques (monde-> écran) dans un monde en forme de diamant. Ceux que j'ai essayés semblent toujours éteints. Quelle est la manière habituelle / correcte de procéder?
Réponses:
Sur la base de votre commentaire, voici le code que j'utilise pour convertir les valeurs des tuiles x, y en coordonnées à l'écran. Maintenant, il ne prend pas en compte les "tuiles 3D", tout est considéré comme étant sur le même plan, donc si vous écrivez un jeu là où ça compte, ce code ne fonctionnera pas.
//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
point screen;
//calculate the screen coordinates
//note: these will then be modified by the camera
screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
return screen;
}
le point est simplement une structure contenant des entiers x et y, TILE_WIDTH serait 64 dans votre cas, TILE_DEPTH est un peu mal nommé (c'est en fait la hauteur des graphiques de tuile), mais ce serait 32 dans votre cas. Les décalages sont si vous voulez que votre carte de tuiles "commence" à un emplacement x, y différent (comme si vous voulez que les tuiles soient au-dessus d'un autre ensemble de tuiles). Le décalage peut généralement être 0,0.
Cela générera une carte avec 0,0 en haut, au milieu, comme ceci:
0,0
0,1 1,0
0,2 1,1 2,1
Quant à trouver la tuile x, y du curseur:
point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;
Dans ce morceau de code, mX et mY sont les coordonnées de l'écran de la souris, que nous combinons avec les valeurs de la caméra pour savoir où nous en sommes dans les "coordonnées mondiales". Tout le reste est identique à l'exemple de code précédent.
Encore une fois, cela suppose une carte de tuile isométrique plate 2D. Il y a du travail supplémentaire si vous voulez utiliser une vue semi-3D de la carte, et tout cela suppose que vous travaillez dans 2d de toute façon.