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

Я пишу игру-стрелялку на Arduino и использую обнаружение столкновений AABB.

ref: Обнаружение столкновения с ограничивающей рамкой

Моя проблема заключается в том, что объекты времени сталкиваются друг с другом, в настоящее время я использую базовый триггер, который действует на время пересечения двух объектов. Я думаю, что то, что мне нужно, лучше всего описывает проблема подсчета импульсов, где независимо от «длины импульса» (или длительности пересечения) обнаруживается только 1 отсчет: введите здесь описание изображения

Как я могу реализовать это на С++? функция, которую я сейчас использую:

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;
}

person Harry Lime    schedule 31.12.2013    source источник


Ответы (2)


Вам нужен детектор границ!

bool collision = false;
int pulses = 0;

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

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

person cactus1    schedule 31.12.2013
comment
хорошо, большое спасибо за внимание - да, я забыл об обнаружении краев для этого. Нет, мне не нужно их считать, я просто хотел проиллюстрировать проблему. - person Harry Lime; 31.12.2013

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

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

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

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

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

person Tommy    schedule 31.12.2013