Saya mencoba mengikuti tutorial ini http://www.tonypa.pri.ee/tbw/tut05.html untuk mengimplementasikan tabrakan real-time di dunia berbasis ubin.
Saya menemukan koordinat pusat entitas saya berkat properti ini:
public float CenterX
{
get { return X + Width / 2f; }
set { X = value - Width / 2f; }
}
public float CenterY
{
get { return Y + Height / 2f; }
set { Y = value - Height / 2f; }
}
Kemudian dalam metode pembaruan saya, di kelas pemain, yang disebut setiap frame, saya memiliki kode ini:
public override void Update()
{
base.Update();
int downY = (int)Math.Floor((CenterY + Height / 2f - 1) / 16f);
int upY = (int)Math.Floor((CenterY - Height / 2f) / 16f);
int leftX = (int)Math.Floor((CenterX + Speed * NextX - Width / 2f) / 16f);
int rightX = (int)Math.Floor((CenterX + Speed * NextX + Width / 2f - 1) / 16f);
bool upleft = Game.CurrentMap[leftX, upY] != 1;
bool downleft = Game.CurrentMap[leftX, downY] != 1;
bool upright = Game.CurrentMap[rightX, upY] != 1;
bool downright = Game.CurrentMap[rightX, downY] != 1;
if(NextX == 1)
{
if (upright && downright)
CenterX += Speed;
else
CenterX = (Game.GetCellX(CenterX) + 1)*16 - Width / 2f;
}
}
downY, upY, leftX dan rightX masing-masing harus menemukan posisi Y terendah, posisi Y tertinggi, posisi X paling kiri dan posisi X paling kanan. Saya menambahkan + Kecepatan * NextX karena dalam tutorial fungsi getMyCorners dipanggil dengan parameter ini:
getMyCorners (ob.x+ob.speed*dirx, ob.y, ob);
Metode GetCellX dan GetCellY:
public int GetCellX(float mX)
{
return (int)Math.Floor(mX / SGame.Camera.TileSize);
}
public int GetCellY(float mY)
{
return (int)Math.Floor(mY / SGame.Camera.TileSize);
}
Masalahnya adalah bahwa pemain "berkedip" saat mengenai dinding, dan deteksi sudut bahkan tidak berfungsi dengan benar karena dapat tumpang tindih dengan dinding yang hanya mengenai salah satu sudut. Saya tidak mengerti apa yang salah. Dalam tutorial, bidang ob.x dan ob.y harus sama dengan properti CenterX dan CenterY saya, dan ob.width dan ob.height harus sama dengan Lebar / 2f dan Tinggi / 2f. Namun itu masih tidak berhasil.
Terima kasih atas bantuan Anda.