我希望事件监听器不仅可以检测到碰撞,还可以检测sprite边界框是否完全位于另一个sprite边界框的旁边,我已经使用了
bool GameScene::onContactBegin(cocos2d::PhysicsContact &contact)
返回false,因为我不想要任何类型的碰撞物理,但仅在第一次接触时触发。
我想使用物理因为它的快速和准确用于我的目的。 任何想法??
答案 0 :(得分: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());
如果sprite都不为null,则将它们存储在碰撞向量中。每次接触物理联系时都这样做。现在,您可以在update()函数中使用它来检查冲突。如果发生冲突,您可以触发自定义事件。您还可以使用更新功能在碰撞结束或清除精灵时清理列表。
要检查碰撞,您需要获取每个精灵的边界框并进行比较。您可以像这样获得边界框:
cocos2d::Rect boundingBox = sprite->getBoundingBox();
现在,您可以通过测试来检查两个边框是否相互检查,以查看框的4个角是否在另一个框内。您可以使用Rect的containsPoint()函数来执行此操作。
最后,如果您发现boundingBoxs位于另一个内部,则触发自定义碰撞事件:
void onCollisionInside(Sprite* spriteA, Sprite* spriteB)
{
//do something
}