如何创建事件监听器来检测sprite边界框是否完全位于cocos2dx中的另一个sprite边界框?

时间:2016-06-03 00:48:36

标签: c++11 cocos2d-x cocos2d-x-3.0

我希望事件监听器不仅可以检测到碰撞,还可以检测sprite边界框是否完全位于另一个sprite边界框的旁边,我已经使用了

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

返回false,因为我不想要任何类型的碰撞物理,但仅在第一次接触时触发。

我想使用物理因为它的快速和准确用于我的目的。 任何想法??

1 个答案:

答案 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
}