cocos2d-x节点(b2WorldCallbacks.h)API

时间:2022-08-30 00:05:12

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