本文来自http://blog.csdn.net/runaying ,引用必须注明出处!
cocos2d-x节点(b2WorldCallbacks.h)API
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
//物理世界里面的回调类,这个类里面定义了一些其它的回调类(光线投射,AABB查询,碰撞过滤......),你可以通过实现它们获取相应的功能
/// 当 body被破坏时,与他们关联的 joints(接头)、 fixture(定制器)也会被破坏
//实现这个监听,这样你就可以抵消这个 joints(接头)和形状的引用
///cocos2d-x-3.0alpha0/external/Box2D/Dynamics //物理世界里面的回调类,这个类里面定义了一些其它的回调类(光线投射,AABB 查询,碰撞过滤......),你可以通过实现它们获取相应的功能 /// 当 body 被破坏时,与他们关联的 joints(接头)、 fixture(定制器)也会被破坏 //实现这个监听,这样你就可以抵消这个 joints(接头)和形状的引用 #ifndef B2_WORLD_CALLBACKS_H #define B2_WORLD_CALLBACKS_H #include <Box2D/Common/b2Settings.h> struct b2Vec2; struct b2Transform; class b2Fixture; class b2Body; class b2Joint; class b2Contact; struct b2ContactResult; struct b2Manifold; /// 当 body 被破坏时,与他们关联的 joints(接头)、 fixture(定制器)也会被破坏 //实现这个监听,这样你就可以抵消这个 joints(接头)和形状的引用 class b2DestructionListener { public: virtual ~b2DestructionListener() {} /// 任何一个 body 被破坏,导致和他关联的 joints(接头)也被摧毁 virtual void SayGoodbye(b2Joint* joint) = 0; /// 任何一个 parent body 被破坏,导致和他关联的 fixture(定制器)也被摧毁 virtual void SayGoodbye(b2Fixture* fixture) = 0; }; ///实现这个类提供碰撞过滤。换句话说,,如果你想更好地控制接触创建,你可以实现这个类, class b2ContactFilter { public: virtual ~b2ContactFilter() {} /// Return true 接触计算应该在两个形状之间执行 /// @warning 出于性能方面的考虑,这应该仅在 AABB 开始重叠的时候被调用 virtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB); }; /// 接触脉冲报告 ,冲量用来代替力,因为分步力可以无限接近刚体碰撞,这些 b2Manifold 接触点一对一匹配 struct b2ContactImpulse { float32 normalImpulses[b2_maxManifoldPoints]; float32 tangentImpulses[b2_maxManifoldPoints]; int32 count; }; /// 实现这个类来获得接触信息. 您可以使用这些结果,做一些事情,如声音和游戏逻辑 /// 一个时间步骤后,遍历联系列表,你就可以获得接触结果。因为物理是连续的,不可避免的就导致了一些分步,所以你可能会错过一些接触 ///此外,在同一个触点在一个时间步长里,您可能会收到多个回调 /// @warning 你不能够使用这些回调 create/destroy Box2D 实体 class b2ContactListener { public: virtual ~b2ContactListener() {} ///两个 fixture(定制器) 开始接触的时候被调用 virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } ///当两个 fixture(定制器)不再接触的时候调用 virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } /// 接触之后调用更新. 这允许你在 solver(运算器) 之前检查接触 /// 如果你细心,你可以 修改联系分歧 (e.g. disable contact). /// 一个分歧副本,你可以检测变化 /// Note: 只有 awake(醒着)的 bodies 会调用这个方法. /// Note: 当接触点的数目是 0 的时候调用这个事件 /// Note: 传感器不会调用这个方法 /// Note: 如果你设置接触点的数目为 0,你不会得到 EndContact 回调,然而,你可能在下一步得到 BeginContact virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { B2_NOT_USED(contact); B2_NOT_USED(oldManifold); } /// solver(运算器)完成之后让你检查接触. 检查脉冲它非常有用 /// Note: 接触分歧,不包括碰撞脉冲时间。如果子步骤非常小,它可以是任意大小 // 因此冲量提供明确的独立数据结构 /// Note: this is only called for contacts that are touching, solid, and awake. virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { B2_NOT_USED(contact); B2_NOT_USED(impulse); } }; /// AABB 查询的回调类. /// See b2World::Query class b2QueryCallback { public: virtual ~b2QueryCallback() {} /// fixture(定制器)符合 AABB 查询的时候被调用 /// @return false to terminate the query. virtual bool ReportFixture(b2Fixture* fixture) = 0; }; /// 光线投射的回调类 /// See b2World::RayCast class b2RayCastCallback { public: virtual ~b2RayCastCallback() {} /// fixture(定制器)符合查询的时候被调用. 您可以控制光线投射回一个浮点数: /// return -1: 忽略这个 fixture(定制器)然后继续 /// return 0: 终止光线投射 /// return fraction: 光线投射到这个点 /// return 1: 不要修改这个射线然后继续 /// @param fixture 射线击中的 fixture(定制器) /// @param point 初始交点 /// @param normal 法线矢量的交点 /// @return -1 to filter(过滤), 0 to terminate(终止), 修改射线接近命中点, 1 to continue virtual float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction) = 0; }; #endif