Wie gehe ich die Rollenspiel-Bewegung von oben nach unten an?

13

Ich habe ein Spiel, das ich in Java schreibe. Es ist ein Top-Down-Rollenspiel und ich versuche, mit Bewegung in der Welt umzugehen. Die Welt ist größtenteils prozedural und es fällt mir schwer, mit der Bewegung von Charakteren auf der ganzen Welt umzugehen und die Änderungen auf dem Bildschirm wiederzugeben. Ich habe die Welt in Blöcken geladen, die alle Kacheln enthalten.

Wie gehe ich die Charakterbewegung an?

Ich bin ratlos und weiß nicht, wohin ich damit gehen soll.

EDIT : Nun, ich war abstrakt mit dem vorliegenden Thema.

Im Moment kann ich nur daran denken, alles fest in ein 2D-Array zu stecken und die Block-ID und den Player-Offset im Block zu speichern, oder ich könnte einfach alles "schweben" und mich sozusagen zwischen den Kacheln bewegen.

WarmWaffeln
quelle

Antworten:

11

Verwenden Sie Weltkoordinaten

(Oder wie du es ausdrückst, schwimme alles.)

Weltkoordinaten sind das, womit Sie normalerweise arbeiten, und dafür gibt es viele Gründe. Sie sind die einfachste und intuitivste Möglichkeit, Ihre Position in der Welt darzustellen, und die einzige Möglichkeit, die Positionen von zwei Entitäten in derselben Welt wirklich zu vergleichen.

Sie erhalten nichts als Arbeit, indem Sie ihn in einzelnen Blöcken verfolgen lassen. Nun, ein Vorteil ist, dass Sie bestimmen können, in welchem ​​Block er sich befindet, aber Sie können dies bereits mit Weltkoordinaten berechnen.


Der Rest dieser Antwort ist eine Erklärung, wie der Weltblock berechnet wird, in dem sich ein Spieler befindet, basierend auf seinen Weltkoordinaten.

Ich schreibe das Code-Snippet so, als ob Sie eine 2D- Vektorklasse mit dem Namen haben Vector2- die Art des Vektors, den Sie in der Geometrie finden, nicht den Listentyp, der von Vectorangeboten wird java.util. Wenn Sie keine geometrischen Vektorklassen haben, sollten Sie diese online finden oder selbst schreiben (kennt jemand hochwertige Geometriebibliotheken für Java?)

Die Vector2-Klasse enthält ein XFeld und ein YFeld, die öffentliche Zahlen sind (egal, welcher numerische Typ hier verwendet wird).

// Current player X,Y position in the world
Player.Position.X, Player.Position.Y

// An array of map blocks with consistent width and height
Block[x][y] blocks = World.GetBlocks();

// We'll wing it with an example global width/height for all blocks
Block.GetWidth() == 100;
Block.GetHeight() == 100;

// To ensure we're on the same page:
// blocks[0][0] should be at position (0,0) in the world.
// blocks[2][5] should be at position (200,500) due to the width/height of a block.

// Also:
// Assuming (0,0) is in the top-left of the game world, the origin of a block
// is its top-left point. That means the point (200,500) is at the top-left of
// blocks[2][5] (as oppose to, say, its center).

public Vector2 GetPlayersBlockPosition() {
    Vector2 blockPosition = new Vector2();
    blockPosition.X = (int)(Player.Position.X / Block.GetWidth());
    blockPosition.Y = (int)(Player.Position.Y / Block.GetHeight());

    return blockPosition;
}

public Block GetPlayersBlock() {
    Vector2 bp = GetPlayersBlockPosition();
    return blocks[bp.X, bp.Y];
}

Block block = GetPlayersBlock();

2 Funktionen> all das Durcheinander der blockinternen Verfolgung und der blockübergreifenden Übertragung

doppelgreener
quelle
1
Bessere Antwort, als ich gesucht habe
WarmWaffles
0

Ihre Frage ist ein bisschen abstrakt, aber vielleicht suchen Sie nach einem Pfadfindungsalgorithmus, ich schlage A * (http://en.wikipedia.org/wiki/A*_search_algorithm) vor. Auf diese Weise können Sie Ihr Charakterplättchen auf ein Plättchen verschieben, wenn das Gelände nicht blockiert ist.


quelle
1
Es geht eher darum, wie ich das Rendern angehe. Speichere ich die Block-ID und den Player-Offset in jedem Block?
WarmWaffles