2017-08-19 4 views
1

J'ai une carte isométrique dessinée.LibGdx - Crée un sprite suivant un tracé linéaire

Je prends la position actuelle de mon sprite et la position cible de l'endroit où mon sprite devrait être à après le déménagement:

// 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 tracer une simple ligne en utilisant ShapeRenderer pour voir si le local/cible les points sont correctement définis et le rectangle vous permet de voir où commence le rendu de l'image-objet.

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

Chaque sprite de la mine a mis offsetX et offsetY pour ajuster sa position sur le carreau isométrique, parce que chaque sprite est différent.

sortie ressemble à ceci:

img

ce que vous pouvez voir ici, est le point de départ de l'endroit où le sprite commence à dessiner (vous voyez que les compensations ajustées si le sprite ressemble à son sur la 1,1 tuile.

et vous pouvez voir la ligne qui commence au point de tirage au sort à partir de l'image-objet, et se termine au point de tirage cible de l'image-objet.

maintenant, ma question est, Comment est-ce que je peux faire bouger ce sprite sur le chemin de cette ligne, alors on dirait que le vaisseau avance?

Ainsi, le concept principal de la question est .. Comment pouvez-vous faire un mouvement de sprite en ligne droite, du point local jusqu'au point cible?

Certaines fonctions 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 carreaux sont dessinés avec la même méthode, juste avec la texture de carreaux.

Répondre

1

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

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

Vous devez le calculer sur vos coordonnées matricielles à écran plat, puis le convertir en coordonnées isométriques.

Par exemple, je veux monter comme cette ligne, tout ce que je dois 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.

Alors vous faites cette augmentation, puis pour le dernier, vous devez le convertir en coordonnées isométriques avant de tirer:

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 qui attirera sur la carte isométrique, exactement comme sur votre écran - coordonne, mais sur un format isométrique.

0
for(float x : new float[targetx - currentx]) {ship.setPosition(ship.getX + x, ship.getY); } 

Et vous feriez la même chose pour y.

Edit:

Je suppose que cela est faux puisque vous appelez ce chaque image que je suppose. Au lieu de cela, vous garderiez une trace de votre distance parcourue entre la cible et le navire et vous augmenteriez la position de la gorgée de 1 à chaque fois en x et y jusqu'à ce qu'elle atteigne la distance.

+0

Oui, il appelle tous les cadres. Si j'ajoute 1 à x et y à chaque fois, ce ne sera pas vraiment une ligne droite – Jony

+0

Mais si la différence en y est 0, alors il va juste augmenter sur l'axe des x pour que le vaisseau se déplace en ligne droite –