столкновение — счетчик импульсов C ++

Я пишу стрелялку на 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;
}

0

Решение

Вам нужен детектор краев!

bool collision = false;
int pulses = 0;

//For each frame..
if(!collision && CollisionTest(....)) {
pulses++;
}
collision = CollisionTest(....);

Не уверен, почему нужно их считать, но для этого стоит это сделать.

1

Другие решения

Таким образом, вы хотите поймать только передний край? Нет ничего особенно умного, чтобы сказать, что вы должны сравнить текущее значение с предыдущим значением.

Как вам лучше всего это сделать, вероятно, зависит от вашего более широкого формата данных.

Если вы сохраняете свои объекты как положение и скорость, и просто добавляете скорость в каждом кадре (то есть, по существу, в интеграцию Эйлера), тогда вы можете инициировать столкновение, когда нет перекрытия для каждой позиции, но есть для каждой позиции + скорость. Это потенциальный ответ, даже если вы явно не храните скорость, но можете предоставить ее другими способами.

Точно так же, если вы сохраняете текущую позицию и последнюю позицию (например, для интеграции Verlet), то вы можете сделать два теста, как это.

Если есть удобная структура для просто сохранения результата из предыдущего кадра и сравнения с текущим, то это тоже вариант — std::map индексируется std::pair может быть излишним, если у вас ограниченный объем памяти или кеша, но если есть какие-то специальные знания, специфичные для игры, которыми вы можете воспользоваться, то вам, возможно, не придется списывать эту опцию.

0

По вопросам рекламы [email protected]