Обнаружение столкновений между спрайтом и массивом спрайтов

Я работаю над бесконечным бегуном, и мне нужно иметь обнаружение столкновений между одним спрайтом и любым спрайтом из CCArray спрайтов. Как вы предлагаете мне это сделать? В настоящее время это метод, который я вызываю для проверки столкновений, но он не работает.

bool RunningScene::spritesAreColliding(cocos2d::CCSprite *spr1, cocos2d::CCSprite *spr2)
{
//Take the bounding box of the two sprites that are bounded
CCRect r1 = spr1->boundingBox();
CCRect r2 = spr2->boundingBox();

if (r1.intersectsRect(r2)) { //Check if the bounding boxes are intersecting and return a true/false
return true;
} else {
return false;
}

}

Я использую его в операторе if, и если он возвращает true, оператор if работает.
Я не надеюсь на идеальное обнаружение коллизий с точки зрения пикселей, но мне интересно, будет ли этот метод работать для проверки коллизий, и мне интересно, как получить доступ к любому спрайту из CCArray, который случайно сталкивается со спрайтом _runner.

0

Решение

Я не уверен, почему ваш код не работает, потому что я не вижу, что вы делаете. Предположим, что метод возвращает true. Чем ты занимаешься?

Обнаружение столкновения сложно. Я предлагаю вам ознакомиться с соответствующими главами этой книги: Обнаружение столкновений в реальном времени.

Есть два подхода: непрерывный и дискретный.

Похоже, вы пытаетесь использовать дискретное обнаружение столкновений. Это когда вы реагируете на столкновения после они случаются. Вам нужно найти ось проникновения, чтобы вы знали, в каком направлении «раздвинуть коробки». Один простой, но медленный способ сделать это — на данный момент выполнить своего рода «бинарный поиск». как раз перед они начали сталкиваться. Возьмите объекты на свои позиции, прежде чем их скорости были применены (начало кадра). Теперь примените половину их скоростей. Они пересекаются? Если нет, примените 0,75 к их скоростям, и если да, примените 0,25 к их скоростям. Повторите для заданного количества итераций и до тех пор, пока они больше не пересекаются.

Вам также нужно будет установить их скорости так, чтобы они либо «отскакивали», либо, по крайней мере, прекратили движение вдоль оси, по которой они в последний раз пересекались.

Обнаружение дискретных столкновений проблематично. Наиболее известной проблемой является туннелирование. Это когда объекты движутся так быстро, что они не пересекаются. Когда их скорости применяются, «движутся сквозь друг друга», и столкновение никогда не фиксируется. Для 2D обнаружения столкновений я рекомендую непрерывный подход.

0

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