Usar coordenadas mundiais
(Ou como você diz, flutue tudo.)
Geralmente, você trabalha com coordenadas mundiais e há muitas razões para isso. Eles são a maneira mais simples e intuitiva de representar sua posição no mundo e a única maneira de realmente comparar as posições de quaisquer duas entidades no mesmo mundo.
Você não ganha nada além de trabalhar fazendo com que ele seja rastreado em blocos individuais. Bem, uma vantagem é que você pode determinar em qual bloco ele está, mas você já pode calcular isso com as coordenadas do mundo.
O restante desta resposta será uma explicação de como calcular o bloco mundial em que um jogador está, com base em suas coordenadas mundiais.
Escreverei o trecho de código como se você tivesse uma classe de vetores 2D denominada Vector2
- o tipo de vetor encontrado em geometria, não o Vector
tipo de lista oferecido por java.util
. Se você não tem nenhuma classe geométrica de vetores, deve encontrar algumas on-line ou escrever algumas (você conhece alguma biblioteca de geometria de qualidade para Java?)
A classe Vector2 terá um X
campo e um Y
campo, que são números públicos (não importa qual tipo numérico aqui).
// 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 funções> toda a bagunça do rastreamento dentro do bloco e da transferência entre blocos