Tôi đang cố gắng làm theo hướng dẫn này http://www.tonypa.pri.ee/tbw/tut05.html để thực hiện các va chạm trong thời gian thực trong một thế giới dựa trên gạch.
Tôi tìm thấy tọa độ trung tâm của các thực thể của mình nhờ các thuộc tính này:
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; }
}
Sau đó, trong phương thức cập nhật của tôi, trong lớp trình phát, được gọi là mọi khung, tôi có mã này:
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 và rightX lần lượt sẽ tìm vị trí Y thấp nhất, vị trí Y cao nhất, vị trí X ngoài cùng bên trái và vị trí X ngoài cùng bên phải. Tôi thêm + Tốc độ * NextX vì trong hướng dẫn, hàm getMyCorners được gọi với các tham số sau:
getMyCorners (ob.x+ob.speed*dirx, ob.y, ob);
Các phương thức GetCellX và 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);
}
Vấn đề là người chơi "nhấp nháy" trong khi va vào tường và phát hiện góc thậm chí không hoạt động chính xác vì nó có thể chồng lên các bức tường chỉ va vào một trong các góc. Tôi không hiểu điều gì là sai. Trong hướng dẫn, các trường ob.x và ob.y phải giống như các thuộc tính CenterX và CenterY của tôi, và ob. Thong và ob.height phải giống như Width / 2f và height / 2f. Tuy nhiên nó vẫn không hoạt động.
Cảm ơn bạn đã giúp đỡ.