Просто для предисловия к этому вопросу учтите, что я не прошу «исправить свой код», а какие методы я использовал бы, чтобы исправить эту проблему. Я также извиняюсь, если мое правописание не очень хорошо.2D C++ Обнаружение столкновений почти идеально, но не совсем?
Хорошо, поэтому у меня есть 2D-платформа, которая сравнивает позицию игроков со всеми плитами (в цикле), соответственно разрешает столкновение. Это в значительной степени структура основного игрового цикла:
- Проверьте все столкновения (и дает возможность прыгать, если столкновение пыльника с игрока произошло)
- Получить вход и скорость игрока изменений соответственно
- Добавить тяжести скорость Y
- Нанести скорость и трение в положение игроков
- рисовать игру
- повторить
Но, несмотря на эту работу, существуют две незначительные, но заметные проблемы с системой столкновений (я предоставил изображения, чтобы упростить их). Есть две проблемы: первая не так уж плоха, но вторая рендеринга игра почти неиграбельная!
Проблема 1. Когда вы двигаетесь влево и вправо по полу в игре, иногда игрок теряет всю полученную скорость, а затем должен повторно накапливать эту скорость. Я думаю, это потому, что время от времени моя функция обнаружения столкновений не возвращается должным образом. вот изображение:
Я надеюсь, что было ясно, что проблема только действительно становится очевидным при перемещении через много плоской земли.
Задача 2 (Это еще хуже) Проблема заключается в том, что игрок может по существу прыгать вверх по стенам, потому что, если вы скажете, например, удерживая левую стрелку и удерживая прыжок, игрок будет прыгать вверх по стене. Я предполагаю, что это потому, что функция обнаружения столкновений возвращается true, если столкновение идет со стороны (хотя это не должно). Вот еще одна картина (текст небольшой, извините):
Так вот моя функция обнаружения столкновений, которая должна в двух «объектов», то возвратите от первого объекта, на котором произошло столкновение, я думаю, что проблема вызывает, когда речь идет об определении направления, как это вызывает проблемы, как показано выше:
//Find the collision vectors
float vectorX = (a.Position.x + (a.Scale.x/2)) - (b.Position.x + (b.Scale.x/2));
float vectorY = (a.Position.y + (a.Scale.y/2)) - (b.Position.y + (b.Scale.y/2));
//Find the distance between the two objects
float deltaWidth = (a.Scale.x/2) + (b.Scale.x/2);
float deltaHeight = (a.Scale.y/2) + (b.Scale.y/2);
//Stores the direction of collision
Direction collisionDir = Direction::None;
//Check if the two objects are intersecting on the x and y axis
if (fabs(vectorX) < deltaWidth && fabs(vectorY) < deltaHeight)
{
//The direction of collision
float directionX = deltaWidth - fabs(vectorX);
float directionY = deltaHeight - fabs(vectorY);
//Check for vertical collision
if (directionX >= directionY)
{
//Check for collisions from the top
if (vectorY > 0)
{
a.Velocity.y = 0;
a.Position.y += directionY;
collisionDir = Direction::Up;
}
//Collisions form the botttom
else
{
a.Velocity.y = 0;
a.Position.y -= directionY;
collisionDir = Direction::Down;
}
}
else if (directionX < directionY/2)
{
//Check for collisions from the left
if (vectorX > 0)
{
a.Velocity.x = 0;
a.Position.x += directionX;
collisionDir = Direction::Left;
}
//Collisions form the right side
else
{
a.Velocity.x = 0;
a.Position.x -= directionX;
collisionDir = Direction::Right;
}
}
}
//Return the direction.
return collisionDir;
Это возвращает направление, мой другой код также проверяет, что направление == Bottom, то это позволит прыжки.
Спасибо за помощь. Я тренируюсь для Людума Дэйра, потому что я планирую (возможно) сделать платформер, и если я не могу определить обнаружение столкновения, я не знаю, насколько хороша моя игра.
В любом случае спасибо - Coder Cameron
Добавить запись в свою игру, в которой будут записаны все данные, связанные с обнаружением столкновения. Таким образом, вы сможете найти условия, в которых он ведет себя неправильно. –