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 Vector
angeboten 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 X
Feld und ein Y
Feld, 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
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