Utiliser les coordonnées mondiales
(Ou comme vous le dites, faites tout flotter.)
Les coordonnées mondiales sont ce avec quoi vous travaillez généralement, et il y a beaucoup de raisons à cela. Ils sont le moyen le plus simple et intuitif de représenter votre position dans le monde, et le seul moyen de vraiment comparer les positions de deux entités dans le même monde.
Vous ne gagnez rien d'autre que du travail en le faisant suivre dans des blocs individuels. Eh bien, un avantage est que vous pouvez déterminer dans quel bloc il se trouve, mais vous pouvez déjà le calculer avec les coordonnées du monde.
Le reste de cette réponse sera une explication de la façon de calculer le bloc du monde dans lequel se trouve un joueur en fonction de ses coordonnées mondiales.
J'écrirai l'extrait de code comme si vous aviez une classe de vecteurs 2D nommée Vector2
- le type de vecteur que vous trouvez en géométrie, pas le Vector
type de liste proposé par java.util
. Si vous n'avez pas de classes vectorielles géométriques, vous devriez en trouver en ligne ou en écrire vous-même (quelqu'un connaît des bibliothèques de géométrie de qualité pour Java?)
La classe Vector2 aura un X
champ et un Y
champ, qui sont des nombres publics (peu importe le type numérique ici).
// 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 fonctions> tout le désordre du suivi intra-bloc et du transfert inter-bloc