实现此目的的一种方法是将碰撞的精灵存储在向量中:
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();
现在您可以通过测试来检查两个边界框,以查看框的 4 个角是否在另一个框内。您可以使用 Rect 的 containsPoint() 函数来执行此操作。
最后,如果你发现boundingBoxs在另一个里面,触发一个自定义碰撞事件:
void onCollisionInside(Sprite* spriteA, Sprite* spriteB)
{
//do something
}