查询

你肯定有站着一个地方往四周看的经历?你能看到离你近的地方,也能看到离你远的东西,你能判断出它们离你有多远。物理引擎也提供了类似的空间查询功能。

Cocos2d-x 提供的 PhysicsWorld 对象支持点查询,射线查询和矩形查询。

点查询

当你碰到什么东西,比如说你的桌子的时候,你可以将这种情景作为一个点查询的例子。点查询是检查一个点周围的一定距离内是否有物体。通过点查询你可以找到一个物体中距离某定点最近的点,或者找到距离一个定点最近的物体,这非常适合于判断鼠标点击拾取的对象,也可以利用它进行一些其它的简单感知。

射线查询

当你四处看的时候,在你视线内的某些物体肯定会引起你的注意,你可以将这种情景作为一个射线查询的例子。射线查询是检查从一个定点发出的射线是否相交于一个物体,如果相交可以获取到一个交叉点,这非常适合于判断子弹(忽略子弹的飞行时间)是否命中。

示例:

C++

  1. void tick(float dt)
  2. {
  3. Vec2 d(300 * cosf(_angle), 300 * sinf(_angle));
  4. Vec2 point2 = s_centre + d;
  5. if (_drawNode)
  6. {
  7. removeChild(_drawNode);
  8. }
  9. _drawNode = DrawNode::create();
  10. Vec2 points[5];
  11. int num = 0;
  12. auto func = [&points, &num](PhysicsWorld& world,
  13. const PhysicsRayCastInfo& info, void* data)->bool
  14. {
  15. if (num < 5)
  16. {
  17. points[num++] = info.contact;
  18. }
  19. return true;
  20. };
  21. s_currScene->getPhysicsWorld()->rayCast(func, s_centre, point2, nullptr);
  22. _drawNode->drawSegment(s_centre, point2, 1, Color4F::RED);
  23. for (int i = 0; i < num; ++i)
  24. {
  25. _drawNode->drawDot(points[i], 3, Color4F(1.0f, 1.0f, 1.0f, 1.0f));
  26. }
  27. addChild(_drawNode);
  28. _angle += 1.5f * (float)M_PI / 180.0f;
  29. }

 查询  - 图1

矩形查询

矩形查询提供了一种快速检查区域中有哪些物体的方法,实现起来非常容易:

C++

  1. auto func = [](PhysicsWorld& world, PhysicsShape& shape, void* userData)->bool
  2. {
  3. //Return true from the callback to continue rect queries
  4. return true;
  5. }
  6. scene->getPhysicsWorld()->queryRect(func, Rect(0,0,200,200), nullptr);

这是在制作 Logo 击碎时使用矩形查询的例子:

 查询  - 图2

 查询  - 图3

原文: http://docs.cocos.com/cocos2d-x/manual/zh/physics/queries.html