У меня есть что-то вроде этого:2D игры плиточного обнаружение столкновения
// checking on which tile are players corners
// ignore this big mess below, please. It can be put in smaller
// equations, but for now it does its job
left_downX = ((int)Position.X)/32 * 32/32 - map.mapOffsetX/32 * 32/32;
left_downY = ((int)Position.Y + height)/32 * 32/32 - map.mapOffsetY/32 * 32/32;
right_downX = ((int)Position.X + width)/32 * 32/32 - map.mapOffsetX/32 * 32/32;
right_downY = ((int)Position.Y + height)/32 * 32/32 - map.mapOffsetY/32 * 32/32;
left_upX = ((int)Position.X)/32 * 32/32 - map.mapOffsetX/32 * 32/32;
left_upY = ((int)Position.Y)/32 * 32/32 - map.mapOffsetY/32 * 32/32;
right_upX = ((int)Position.X + width)/32 * 32/32 - map.mapOffsetX/32 * 32/32;
right_upY = ((int)Position.Y)/32 * 32/32 - map.mapOffsetY/32 * 32/32;
// checking if there is collision and responding to it
if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air &&
map.mapData[left_upX, left_upY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.A))
{
Speed.X = playerSpeed;
Direction.X = MOVE_LEFT;
}
}
if (map.mapData[right_downX, right_downY] == (int)Map.Tiles.air &&
map.mapData[right_upX, right_upY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.D))
{
Speed.X = playerSpeed;
Direction.X = MOVE_RIGHT;
}
}
if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air &&
map.mapData[right_downX, right_downY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.S))
{
Speed.Y = playerSpeed;
Direction.Y = MOVE_DOWN;
}
}
if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air &&
map.mapData[right_downX, right_downY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.W))
{
Speed.Y = playerSpeed;
Direction.Y = MOVE_UP;
}
}
И, как кажется, правильно работать, это не так. Например, когда игрок сталкивается с землей, он остается в нем и не может двигаться в любом направлении.
Это похоже при столкновении только с плитками по бокам, но там вы можете перейти на другую сторону.
Что я не так понял? Может быть, есть ли лучшие способы проверки столкновений, не зацикливая все плитки?
, но он хорошо проверяет столкновений, и я также не хочу, чтобы все циклы выполнялись. У меня проблемы с ответами, так как игрок застревает только стоячая палочка или в некоторых случаях плавает сквозь стены, иногда просто скользит. – Neomex
Самое лучшее, что нужно сделать с картой на основе плитки, - это проверить только те плитки, которые находятся рядом с объектом, который проверяется на наличие столкновений. Это должно быть достаточно легко сделать с координатами рассматриваемого объекта. Для меня ваш игрок застревает, потому что ваше столкновение работает неправильно. – jgallant