LibGdx - Machen Sie Sprite einem Zeilenpfad folgen - Java, Grafik, libgdx

Ich habe eine isometrische Karte gezeichnet.

Ich nehme die aktuelle Position meines Sprites und die Zielposition von wo mein Sprite nach dem Zug sein sollte:

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

Und dann zeichne ich eine einfache Linie mit ShapeRenderer um zu sehen, ob die lokalen / Zielpunkte richtig gesetzt sind, und das Rechteck, damit Sie sehen können, wo das Sprite-Rendering startet.

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

Jedes Sprite von mir hat OffsetX und OffsetY gesetzt, um seine Position auf der isometrischen Kachel einzustellen, da jedes Sprite anders ist.

Die Ausgabe sieht folgendermaßen aus:

img

Was Sie hier sehen können, ist der Anfangspunkt, an dem das Sprite beginnt zu zeichnen (Sie sehen, dass Offsets es so eingestellt haben, dass das Sprite wie sein auf der Seite aussieht 1,1 Fliese.

und Sie können die Linie sehen, die am Start-Zeichenpunkt des Sprites beginnt und am Ziel-Zeichenpunkt des Sprites endet.

Nun ist meine Frage, wie kann ich das Sprite auf dem Weg dieser Linie bewegen lassen, so wird es aussehen als würde das Schiff vorwärts gehen?

Also das Hauptkonzept der Frage ist.. Wie können Sie einen Sprite in einer geraden Linie bewegen, vom lokalen Punkt zum Zielpunkt?

Einige Funktionen, die Sie möglicherweise sehen müssen:

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

Kacheln werden mit der gleichen Methode gezeichnet, nur mit der Textur von Tile.

Antworten:

1 für die Antwort № 1

Ich möchte mir diese Frage selbst beantworten, weil andere Leute das gleiche Problem haben und es einfach wie ich übermäßig komplizieren.

Wenn Sie auf Ihrer isometrischen Karte eine Bewegung ausführen möchten, folgen Sie meinen Missverständnissen nicht und berechnen Sie sie auf den isometrischen Koordinaten.

Sie müssen es auf Ihren Flachbildschirm-Koordinaten berechnen und dann in isometrische Koordinaten umrechnen.

Zum Beispiel möchte ich wie diese Linie nach oben gehen, alles was ich tun muss ist:

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

Du weißt also, dass du dabei sein willst 0,1 auf deiner nicht-isometrischen Karte.

Also machst du dieses Inkrement, und dann musst du es vor dem Zeichnen in isometrische Koordinaten umwandeln:

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

Und das wird es auf der isometrischen Karte genau wie auf Ihren Bildschirmkoordinaten zeichnen, aber auf einem isometrischen Format.


0 für die Antwort № 2
for(float x : new float[targetx - currentx]) {ship.setPosition(ship.getX + x, ship.getY); }

Und du würdest das gleiche für dich tun.

Bearbeiten:

Ich schätze, das ist falsch, da du jeden Frame anrufst, den ich annehme.

Stattdessen würden Sie Ihre Distanz zwischen Ziel und Schiff verfolgen und Sie würden die Schluckposition jeweils um 1 auf x und y erhöhen, bis die Entfernung erreicht ist.


Am beliebtesten