Gunakan Koordinat Dunia
(Atau seperti yang Anda katakan, apungkan semuanya.)
Koordinat dunia adalah tempat Anda bekerja secara umum, dan ada banyak alasan untuk itu. Mereka adalah cara paling sederhana dan intuitif untuk mewakili posisi Anda di dunia, dan satu-satunya cara untuk benar-benar membandingkan posisi dari dua entitas di dunia yang sama.
Anda mendapatkan apa-apa selain bekerja dengan membuatnya dilacak dalam blok individu. Nah, satu keuntungan adalah Anda bisa menentukan di blok mana dia berada, tetapi Anda sudah bisa menghitungnya dengan koordinat dunia.
Sisa dari jawaban ini akan menjadi penjelasan tentang bagaimana cara menghitung blok dunia yang digunakan pemain berdasarkan koordinat dunianya.
Saya akan menulis cuplikan kode seolah-olah Anda memiliki kelas vektor 2D bernama Vector2
- jenis vektor yang Anda temukan dalam geometri, bukan Vector
tipe daftar yang ditawarkan oleh java.util
. Jika Anda tidak memiliki kelas vektor geometris, Anda harus menemukan beberapa online atau menulis sendiri (ada yang tahu perpustakaan geometri berkualitas untuk Java?)
Kelas Vector2 akan memiliki X
bidang dan Y
bidang, yang merupakan angka publik (tidak masalah tipe numerik mana di sini).
// 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 fungsi> semua kekacauan pelacakan dalam-blok dan transfer antar-blok