本文来自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