【问题标题】:how to create event listener to detect if a sprite bounding box is completely in side another sprite bounding box in cocos2dx?如何创建事件监听器来检测一个精灵边界框是否完全在 cocos2dx 中的另一个精灵边界框旁边?
【发布时间】:2016-06-03 00:48:36
【问题描述】:

我希望事件监听器不仅检测碰撞,而且检测精灵边界框是否完全在另一个精灵边界框旁边,我使用过

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

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

我想使用物理学,因为它对我的目的来说既快速又准确。 有什么想法吗??

【问题讨论】:

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


    【解决方案1】:

    实现此目的的一种方法是将碰撞的精灵存储在向量中:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      相关资源
      最近更新 更多