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 Vector
typ 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 X
pole i Y
pole, 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