Usar coordenadas mundiales
(O como lo pones, flota todo).
Las coordenadas mundiales son con lo que generalmente trabajas, y hay muchas razones para eso. Son la forma más simple e intuitiva de representar su posición en el mundo, y la única forma de comparar realmente las posiciones de dos entidades en el mismo mundo.
No ganas nada más que trabajo haciendo que lo rastreen dentro de bloques individuales. Bueno, una ventaja es que puedes determinar en qué bloque está, pero ya puedes calcular eso con coordenadas mundiales.
El resto de esta respuesta será una explicación de cómo calcular el bloque mundial en el que se encuentra un jugador según sus coordenadas mundiales.
Escribiré el fragmento de código como si tuviera una clase de vector 2D llamada Vector2
: el tipo de vector que encuentra en geometría, no el Vector
tipo de lista ofrecido por java.util
. Si no tiene clases de vectores geométricos, debería encontrar algunas en línea o escribirlas usted mismo (¿alguien conoce alguna biblioteca de geometría de calidad para Java?)
La clase Vector2 tendrá un X
campo y un Y
campo, que son números públicos (no importa qué tipo numérico aquí).
// 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 funciones> todo el desorden del seguimiento dentro del bloque y la transferencia entre bloques