Usa coordinate mondiali
(O mentre lo metti, fai galleggiare tutto.)
Le coordinate del mondo sono ciò con cui generalmente lavori e ci sono molte ragioni per questo. Sono il modo più semplice e intuitivo di rappresentare la tua posizione nel mondo e l'unico modo per confrontare realmente le posizioni di due entità nello stesso mondo.
Non ottieni altro che lavorare facendolo rintracciare all'interno di singoli blocchi. Bene, un vantaggio è che puoi determinare in quale blocco si trova, ma puoi già calcolarlo con le coordinate del mondo.
Il resto di questa risposta sarà una spiegazione di come calcolare il blocco del mondo in cui si trova un giocatore in base alle sue coordinate mondiali.
Scriverò lo snippet di codice come se avessi una classe vettoriale 2D chiamata Vector2
- il tipo di vettore che trovi nella geometria, non il Vector
tipo di elenco offerto da java.util
. Se non hai classi Vector geometriche, dovresti trovarne alcune online o scriverne alcune tu stesso (qualcuno conosce librerie di geometria di qualità per Java?)
La classe Vector2 avrà un X
campo e un Y
campo, che sono numeri pubblici (non importa quale tipo numerico qui).
// 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 funzioni> tutto il caos del tracciamento all'interno del blocco e del trasferimento tra i blocchi