如何创建事件侦听器以检测精灵边界框是否完全位于 cocos2dx 中的另一个精灵边界框内?
how to create event listener to detect if a sprite bounding box is completely in side another sprite bounding box in cocos2dx?
我希望事件侦听器不仅可以检测碰撞,还可以检测精灵边界框是否完全位于另一个精灵边界框内,我已经使用了
bool GameScene::onContactBegin(cocos2d::PhysicsContact &contact)
返回 false,因为我不想要任何类型的碰撞物理,但只在第一次接触时触发。
我想使用物理学,因为它对我的目的来说既快速又准确。
有什么想法吗??
实现此目的的一种方法是将碰撞精灵存储在向量中:
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() 函数来执行此操作。
最后,如果您发现边界框位于另一个边界框内,则触发自定义碰撞事件:
void onCollisionInside(Sprite* spriteA, Sprite* spriteB)
{
//do something
}
我希望事件侦听器不仅可以检测碰撞,还可以检测精灵边界框是否完全位于另一个精灵边界框内,我已经使用了
bool GameScene::onContactBegin(cocos2d::PhysicsContact &contact)
返回 false,因为我不想要任何类型的碰撞物理,但只在第一次接触时触发。
我想使用物理学,因为它对我的目的来说既快速又准确。 有什么想法吗??
实现此目的的一种方法是将碰撞精灵存储在向量中:
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() 函数来执行此操作。
最后,如果您发现边界框位于另一个边界框内,则触发自定义碰撞事件:
void onCollisionInside(Sprite* spriteA, Sprite* spriteB)
{
//do something
}