Saat ini saya sedang mengerjakan sendiri permainan berbasis ubin (pikirkan Terraria, tapi kurang fantastik (saya pikir itu sebuah kata? Maaf jika tidak)).
Ngomong-ngomong, saat ini saya memiliki pendeteksian tabrakan (untuk kasus sudut!) Yang merupakan langkah besar bagi saya. Ada sesuatu yang sangat memuaskan melihat sprite tidak berjalan melalui blok. Tapi kemudian saya punya ide untuk benchmark. Ide buruk.
1.000 kotak, tidak ada masalah. 10.000 kotak, untuk 3 karakter agak lamban. 100.000 kotak (peta sangat besar), untuk 3 karakter tidak dapat dimainkan.
Saya mengalami masalah di mana saya tidak ingin mempertimbangkan blok yang terlalu jauh dari pemain, karakter, item, dll., Tetapi saya tidak ingin memuat yang keluar dari memori terus-menerus.
Inilah algoritma saya sejauh ini, jangan ragu untuk mengkritik.
foreach (Block in level)
{
if (distance from block to player > a specified amount)
ignore this block;
else
{
get the intersection depth between the two bounding boxes
if (depth of intersection != Zero-vector)
{
check y size vs x size
resolve on smallest axis
}
}
}
Seperti yang akan Anda perhatikan, ketika ukuran level semakin besar, Urutan algoritma ini tumbuh sebesar N blok. Saya bahkan tidak ingin mempertimbangkan blok yang tidak berada di dekat pemain.
Saya berpikir mungkin menggunakan (0,0) untuk (mapWidth, mapHeight) susunan ganda blok bukan daftar, menghitung zona bahaya tergantung pada posisi orang tersebut mis., Jika posisi pemain berada di (10, 20) akan terlihat dari (0, 10) hingga (20, 30), atau seterusnya.
Segala pemikiran dan pertimbangannya luar biasa, terima kasih.