cocos2d-x节点(b2Joint.h)API

本文主要介绍了cocos2d-x中b2Joint.h文件的API,讲解了如何使用这些关节来约束两个不同的身体(body)。建议读者参考作者的Cocos2d-X权威指南笔记以深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-x节点(b2Joint.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

// joints(接头)的基类.joints(接头)用来约束两个不同类型的 body .

///cocos2d-x-3.0alpha0/external/Box2D/Dynamics/Joints
// joints(接头)的基类.joints(接头)用来约束两个不同类型的 body .


#ifndef B2_JOINT_H
#define B2_JOINT_H

#include <Box2D/Common/b2Math.h>

class b2Body;
class b2Joint;
struct b2SolverData;
class b2BlockAllocator;

enum b2JointType
{
    e_unknownJoint,
    e_revoluteJoint,
    e_prismaticJoint,
    e_distanceJoint,
    e_pulleyJoint,
    e_mouseJoint,
    e_gearJoint,
    e_wheelJoint,
    e_weldJoint,
    e_frictionJoint,
    e_ropeJoint
};

enum b2LimitState
{
    e_inactiveLimit,
    e_atLowerLimit,
    e_atUpperLimit,
    e_equalLimits
};

struct b2Jacobian
{
    b2Vec2 linear;
    float32 angularA;
    float32 angularB;
};
// joints(接头)的边缘用于连接 bodies,并添加到 joints(接头)图表,这个表里面有每一个 body 对应的 joints(接头)边缘
//接触范围,属于一个连接到 body 的双向链表
///每一个接触都有两个接触点,一个连接到它们的 body
struct b2JointEdge
{
    b2Body* other;            ///< 供其它 body 快速访问
    b2Joint* joint;            ///< the joint
    b2JointEdge* prev;        ///< body's joints(接头)列表中的上一个 joints(接头)的边缘
    b2JointEdge* next;        ///< body's joints(接头)列表中的下一个 joints(接头)的边缘
};

/// 定义 Joint 用与构建 joints(接头)
struct b2JointDef
{
    b2JointDef()
    {
        type = e_unknownJoint;
        userData = NULL;
        bodyA = NULL;
        bodyB = NULL;
        collideConnected = false;
    }

    /// 这个 joints(接头)类型是根据确切的 joints(接头)类型自动设置的
    b2JointType type;

    /// 使用这个关联应用特定的数据到你的 joints(接头)
    void* userData;

    /// The first attached body.    //关联
    b2Body* bodyA;

    /// The second attached body.
    b2Body* bodyB;

    /// 如果关联的bodies 应该碰撞,这个标志设置为true
    bool collideConnected;
};

/// joints(接头)的基类.joints(接头)用来约束两个不同类型的 body .一些特点受 motors(电力)限制.
class b2Joint
{
public:

    /// Get 具体的 joint(接头)类型.
    b2JointType GetType() const;

    /// 获取第一个 body关联到这个 joints(接头)
    b2Body* GetBodyA();

//    获取第二个 body关联到这个 joints(接头)
    b2Body* GetBodyB();

       /// Get bodyA 的锚点的 world 坐标
    virtual b2Vec2 GetAnchorA() const = 0;

    /// Get bodyB 的锚点的 world 坐标
    virtual b2Vec2 GetAnchorB() const = 0;

//    Get bodyB 的反作用力,再joints(接头)的锚点上(以牛顿为单位)
    virtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0;

    /// Get bodyB上的相反力矩 N*m.
    virtual float32 GetReactionTorque(float32 inv_dt) const = 0;

    /// Get world joints(接头)列表里面的下一个 joint
    b2Joint* GetNext();
    const b2Joint* GetNext() const;

    /// Get the user data pointer.
    void* GetUserData() const;

    /// Set the user data pointer.
    void SetUserData(void* data);

    /// 判断 Short-cut 功能 (body 是无效的)
    bool IsActive() const;

    /// 获得碰撞连接。
    /// Note: 修改碰撞连接标志将无法正常工作,应为当 fixture(定制器)AABBs 开始重叠时,只有这个标识才能被检测
    bool GetCollideConnected() const;

    /// 把joints(接头)的阻尼输出到  log file.
    virtual void Dump() { b2Log("// Dump is not supported for this joint type.\n"); }

protected:
    friend class b2World;
    friend class b2Body;
    friend class b2Island;
    friend class b2GearJoint;

    static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator);
    static void Destroy(b2Joint* joint, b2BlockAllocator* allocator);

    b2Joint(const b2JointDef* def);
    virtual ~b2Joint() {}

    virtual void InitVelocityConstraints(const b2SolverData& data) = 0;
    virtual void SolveVelocityConstraints(const b2SolverData& data) = 0;

    // This returns true 如果位置误差在容差范围内.
    virtual bool SolvePositionConstraints(const b2SolverData& data) = 0;

    b2JointType m_type;
    b2Joint* m_prev;
    b2Joint* m_next;
    b2JointEdge m_edgeA;
    b2JointEdge m_edgeB;
    b2Body* m_bodyA;
    b2Body* m_bodyB;

    int32 m_index;

    bool m_islandFlag;
    bool m_collideConnected;

    void* m_userData;
};

inline b2JointType b2Joint::GetType() const
{
    return m_type;
}

inline b2Body* b2Joint::GetBodyA()
{
    return m_bodyA;
}

inline b2Body* b2Joint::GetBodyB()
{
    return m_bodyB;
}

inline b2Joint* b2Joint::GetNext()
{
    return m_next;
}

inline const b2Joint* b2Joint::GetNext() const
{
    return m_next;
}

inline void* b2Joint::GetUserData() const
{
    return m_userData;
}

inline void b2Joint::SetUserData(void* data)
{
    m_userData = data;
}

inline bool b2Joint::GetCollideConnected() const
{
    return m_collideConnected;
}

#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值