Я пишу стрелялку на Arduino и использую обнаружение столкновений AABB —
ссылка: Обнаружение столкновений в ограничительной коробке
Моя проблема в том, что объекты сталкиваются друг с другом, в настоящее время я использую базовый триггер, который работает в течение времени, когда два объекта пересекаются. Я думаю, что мне нужно лучше всего описать проблему подсчета импульсов, где независимо от «длительности импульса» (или длительности пересечения) обнаруживается только 1 отсчет:
Как я могу реализовать это в C ++? функция, которую я сейчас использую:
bool CollisionTest( xPlayer, yPlayer, xAlien, yAlien, width, height)
{
if( ((xPlayer+width) >= xAlien) && (xPlayer <= (xAlien+width)) &&
((yPlayer+height) >= yAlien) && (yPlayer <= (yAlien+height)) )
return true;
else
return false;
}
Вам нужен детектор краев!
bool collision = false;
int pulses = 0;
//For each frame..
if(!collision && CollisionTest(....)) {
pulses++;
}
collision = CollisionTest(....);
Не уверен, почему нужно их считать, но для этого стоит это сделать.
Таким образом, вы хотите поймать только передний край? Нет ничего особенно умного, чтобы сказать, что вы должны сравнить текущее значение с предыдущим значением.
Как вам лучше всего это сделать, вероятно, зависит от вашего более широкого формата данных.
Если вы сохраняете свои объекты как положение и скорость, и просто добавляете скорость в каждом кадре (то есть, по существу, в интеграцию Эйлера), тогда вы можете инициировать столкновение, когда нет перекрытия для каждой позиции, но есть для каждой позиции + скорость. Это потенциальный ответ, даже если вы явно не храните скорость, но можете предоставить ее другими способами.
Точно так же, если вы сохраняете текущую позицию и последнюю позицию (например, для интеграции Verlet), то вы можете сделать два теста, как это.
Если есть удобная структура для просто сохранения результата из предыдущего кадра и сравнения с текущим, то это тоже вариант — std::map
индексируется std::pair
может быть излишним, если у вас ограниченный объем памяти или кеша, но если есть какие-то специальные знания, специфичные для игры, которыми вы можете воспользоваться, то вам, возможно, не придется списывать эту опцию.