Użyj współrzędnych świata
(Lub, jak to ująłeś, unoś wszystko.)
Współrzędne świata są tym, z czym zwykle pracujesz, i jest wiele powodów. Są to najprostszy i intuicyjny sposób reprezentowania twojej pozycji na świecie i jedyny sposób naprawdę porównania pozycji dowolnych dwóch bytów w tym samym świecie.
Nic nie zyskujesz poza pracą, śledząc go w poszczególnych blokach. Cóż, jedną zaletą jest to, że możesz określić, w którym bloku on jest, ale możesz już to obliczyć za pomocą współrzędnych świata.
Pozostała część tej odpowiedzi będzie wyjaśnieniem, w jaki sposób obliczyć blok świata, w którym znajduje się gracz, na podstawie jego współrzędnych.
Napiszę fragment kodu tak, jakbyś miał klasę wektorów 2D o nazwie Vector2- rodzaj wektora, który znajdziesz w geometrii, a nie Vectortyp listy oferowany przez java.util. Jeśli nie masz żadnych klas geometrycznych Vector, powinieneś znaleźć je online lub napisać je sam (ktoś zna jakieś biblioteki geometrii jakości dla Java?)
Klasa Vector2 będzie miała Xpole i Ypole, które są liczbami publicznymi (nie ma znaczenia, który typ liczbowy tutaj).
// 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 funkcje> cały bałagan śledzenia wewnątrz bloku i przesyłania między blokami