Я пытаюсь следовать этому уроку http://www.tonypa.pri.ee/tbw/tut05.html для реализации столкновений в реальном времени в мире на основе тайлов.
Я нахожу координаты центра моих объектов благодаря этим свойствам:
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; }
}
Затем в моем методе обновления, в классе проигрывателя, который называется каждый кадр, у меня есть этот код:
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 и rightX должны соответственно найти самую низкую позицию Y, самую высокую позицию Y, крайнюю левую позицию X и крайнюю правую позицию X. Я добавляю + Speed * NextX, потому что в учебнике вызывается функция getMyCorners со следующими параметрами:
getMyCorners (ob.x+ob.speed*dirx, ob.y, ob);
Методы GetCellX и 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);
}
Проблема заключается в том, что игрок «мерцает» при ударе о стену, и обнаружение углов даже не работает должным образом, поскольку оно может перекрывать стены, которые поражают только один из углов. Я не понимаю, что не так. В учебнике поля ob.x и ob.y должны быть такими же, как мои свойства CenterX и CenterY, а ob.width и ob.height должны совпадать с Width / 2f и Height / 2f. Однако это все еще не работает.
Спасибо за вашу помощь.