2016-06-03 5 views
0

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

bool GameScene::onContactBegin(cocos2d::PhysicsContact &contact) 

возвращение ложным, потому что я не хочу любой вид физики столкновений, но получил только срабатывание при первом контакте.

Я хочу использовать физику, потому что его быстро и точно для моих целей. любые идеи ??

ответ

0

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

std::vector<std::pair<coco2d::Sprite*, cocos2d::Sprite*>> collisionVector; 

Вы можете получить 2 сталкивающихся объектов спрайтов из контакта так:

auto spriteA = dynamic_cast<Sprite*>(contact.getShapeA()->getBody()->getNode()); 
auto spriteB = dynamic_cast<Sprite*>(contact.getShapeB()->getBody()->getNode()); 

хранить их в столкновении если ни один спрайт не равен нулю. Делайте это каждый раз, когда вы получаете физический контакт. Теперь вы можете использовать это в своей функции update(), чтобы проверить наличие конфликта. Если есть столкновение, вы можете запустить специальное событие. Вы также можете использовать функцию обновления для очистки списка при завершении столкновения или удаления спрайта.

Чтобы проверить наличие столкновения, вам необходимо получить ограничительную рамку каждого спрайта и сравнить их. Вы можете получить ограничительную рамку так:

cocos2d::Rect boundingBox = sprite->getBoundingBox(); 

Теперь вы можете использовать проверить оба boundingBoxes друг против друга, проверяя, чтобы увидеть, если 4 угла коробки находятся в другом окне. Для этого вы можете использовать функцию containsPoint() для Rect.

Наконец, если вы нашли boundingBoxs внутри одного из других, огня события пользовательского столкновения:

void onCollisionInside(Sprite* spriteA, Sprite* spriteB) 
{ 
    //do something 
} 
Смежные вопросы