LibGdx - Faire que le sprite suive un chemin de ligne - java, graphics, libgdx

J'ai une carte isométrique dessinée.

Je prends la position actuelle de mon sprite et la position cible de mon sprite après le déplacement:

    // region is my TextureRegion.
int x1 = getIsometricX(1,1,region);
int x2 = getIsometricX(1,2,region);

int y1= getIsometricY(1,1,region);
int y2 = getIsometricY(1,2,region);

Et puis je dessine une ligne simple en utilisant ShapeRenderer pour voir si les points locaux / cibles sont correctement définis et le rectangle pour que vous puissiez voir où le rendu du sprite commence.

    renderer.setProjectionMatrix(camera.combined);
renderer.begin(ShapeRenderer.ShapeType.Line);
renderer.setColor(Color.RED);
renderer.line(x1 + location.getOffsetx(), y1 + location.getOffsety(), x2 + location.getOffsetx(), y2 + location.getOffsety());
renderer.rect(x1 + location.getOffsetx(), y1 + location.getOffsety(), region.getRegionWidth(), region.getRegionHeight());
renderer.end();

Chacune de mes sprites a défini offsetX et offsetY pour ajuster sa position sur la tuile isométrique, car chaque sprite est différente.

La sortie ressemble à ceci:

img

Ce que vous pouvez voir ici est le point de départ de l’image-objet (le décalage s’ajustera de telle sorte que le sprite 1,1 tuile.

et vous pouvez voir la ligne qui commence au point de départ du sprite et se termine au point de tirage cible du sprite.

Maintenant, ma question est la suivante: comment puis-je déplacer ce sprite sur le chemin de cette ligne, de sorte qu'il semblerait que le vaisseau avance?

Donc, le concept principal de la question est.. Comment pouvez-vous déplacer un sprite en ligne droite, du point local au point cible?

Certaines fonctions que vous pourriez avoir besoin de voir:

public int getIsometricX(int x, int y, TextureRegion region) {
return (x * GameTile.TILE_WIDTH / 2) - (y * GameTile.TILE_WIDTH / 2) - (region.getRegionWidth() / 2);
}

public int getIsometricY(int x, int y, TextureRegion region) {
return (x * GameTile.TILE_HEIGHT / 2) + (y * GameTile.TILE_HEIGHT / 2) - (region.getRegionHeight() / 2);
}

Les tuiles sont dessinées en utilisant la même méthode, juste avec la texture de Tile.

Réponses:

1 pour la réponse № 1

Je voudrais me répondre moi-même à cette question, car d’autres personnes pourraient avoir le même problème et simplement le compliquer comme moi.

Si vous souhaitez effectuer un déplacement sur votre carte isométrique, ne suivez pas mes malentendus et calculez-le sur les coordonnées isométriques.

Vous devez le calculer sur les coordonnées de la matrice de votre écran plat, puis le convertir en coordonnées isométriques.

Par exemple, je veux progresser comme cette ligne, tout ce que j'ai à faire est la suivante:

ship.y += 0.1f // when it reaches 1, then it will be at 0, 1

Donc, vous savez que vous voulez être à 0,1 sur votre carte non isométrique.

Donc, vous faites cet incrément, et puis pour le dernier, vous devez le convertir en coordonnées isométriques avant de dessiner:

float x = (ship.x * GameTile.TILE_WIDTH / 2) - (ship.y * GameTile.TILE_WIDTH / 2) - (textyure.getWidth() / 2);

float y = (ship.x * GameTile.TILE_HEIGHT / 2) + (ship.y * GameTile.TILE_HEIGHT / 2) - (texture.getHeight() / 2);

Et cela va le dessiner sur la carte isométrique, exactement comme sur vos coordonnées d'écran, mais sur un format isométrique.


0 pour la réponse № 2
for(float x : new float[targetx - currentx]) {ship.setPosition(ship.getX + x, ship.getY); }

Et vous feriez la même chose pour y.

Modifier:

Je suppose que c'est faux puisque vous appelez cela chaque image que je suppose.

Au lieu de cela, vous gardez une trace de votre distance parcourue entre la cible et le vaisseau et vous augmentez la position de la gorgée de 1 à chaque fois jusqu'à x et y jusqu'à la distance.


Le plus populaire