转自:http://hi.baidu.com/goodlad/blog/item/5df9bd2b439d01ece7cd40f6.html
AddShape(b2ShapeDef* shape)。
上面这些东西,其实现在没有必要去记住,慢慢运用中就可以熟练掌握。
源文件包里除了这个HelloWorld之外还有不少的例子,个人建议先从CompoundShapes开始。
二、CompoundShapes
CompoundShapes其实也没有做什么事情,相对于HelloWorld来说,我认为,仅仅是多了一个方法的应用,即是有关b2Mat22方阵和向量的相乘应用,这里被用来获得转换后的位置。
这个例子对于看过HelloWorld的你来说,应该会很简单,只是建议看这个例子的时候再翻翻数学书,并复习一下使用到的几种数据类型说明。
三、 VaryingRestitution、VaryingFriction、Pyramid、PolyShapes
Box2D本身所自带的教程相当的少,前两个例程是关于摩擦力和弹性系数的例子,也仅仅修改了相关数据,算是一种演示吧,Pyramid这个例子也就是一个简单的例子,只是使用了Make方法来创建向量。没什么参考价值。
PolyShapes这个例子举个自定义多边形形状的方法,你只要记住当前多边形最多支持顶点数为8就行了。
四、 CollisionFiltering、
碰撞过滤是用来防止形状与形状之间进行碰撞的,就像上文所示,它可以用碰撞种类和组名来区别,Box2D总共提供16种碰撞种类,每个形状都可以提定属于什么种类,那么它就可以和其他不同种类的形状碰撞,如果在一个多人在线游戏中,你想你的玩家在他们之间不进行碰撞,怪物和怪物之间不进行碰撞,但人和怪物进行碰撞,你可以使用
playerShapeDef.categoryBits = 0x0002;
monsterShapeDef.categoryBits = 0x0004;
playerShape.maskBits = 0x0004;
monsterShapeDef.maskBits = 0x0002;
碰撞组索引是一个可以大量指定物体碰撞规则的东西,你可以通过它来指定成百上千的物体,当碰撞组索引为负数时,东西之间不碰撞,当为正数时进行碰撞,而且碰撞组索引的优先级比碰撞种类要高。
shape1Def.groupIndex = 2;
shape2Def.groupIndex = 2;
shape3Def.groupIndex = -8;
shape4Def.groupIndex = -8;
形状1和2就碰撞,因为组索引大于0,而3和4不碰撞,因为小于0
可以参考例子代码来确定你的碰撞方法.
五、 ApplyForce
应力的应用是物理引擎中必不可少的部分,你有刚体能碰撞却不能推动它,那么它必定会给你带来很强的挫败感。
在这个教程中,主要是对刚体的几个方法进行了应用,这些方法都很简单易用。
刚体有两个点对我们有用,一个是刚体的坐标点,另一个是刚体的质心位置。刚体的质心位置就不需要你自己指出,Box2D将会自己算出这个坐标。
刚体有如下几个成员变量,
uint32 m_flags;
质心位置:
b2Vec2 m_position;
质心旋转度:
float32 m_rotation;
线性速度:
b2Vec2 m_linearVelocity;
角速度:
float32 m_angularVelocity;
力:
b2Vec2 m_force;
扭矩:
float32 m_torque;
形状表:
b2Shape* m_shapeList;
形状数:
int32 m_shapeCount;
关节表:
b2JointNode* m_jointList;
关节数:
b2ContactNode* m_contactList;
质量:
float32 m_mass, m_invMass;
float32 m_I, m_invI;
线性阻尼:
float32 m_linearDamping;
角阻尼:
float32 m_angularDamping;
休眠时间
float32 m_sleepTime;
用户数据:
void* m_userData;
并有以下几种方法:
1、设置刚体位置和旋转度
void SetOriginPosition(const b2Vec2& position, float32 rotation);
2、取刚体当前位置
b2Vec2 GetOriginPosition() const;
3、设置刚体的质心位置及旋转度
void SetCenterPosition(const b2Vec2& position, float32 rotation);
4、取得刚体的质心位置
b2Vec2 GetCenterPosition() const;
5、取得旋转度
float32 GetRotation() const;
6、取得旋转矩阵
const b2Mat22& GetRotationMatrix() const;
7、设置和取得质心的线性速度
void SetLinearVelocity(const b2Vec2& v);
b2Vec2 GetLinearVelocity() const;
8、设置和取得角速度
void SetAngularVelocity(float32 w);
float32 GetAngularVelocity() const;
9、应用一个力到世界点上
void ApplyForce(const b2Vec2& force, const b2Vec2& point);
force为力的大小,point为作用点
10、应用一个扭矩
void ApplyTorque(float32 torque);
11、在点上应用一个推力
void ApplyImpulse(const b2Vec2& impulse, const b2Vec2& point);
12、取得质量
float32 GetMass() const;
13、取得惯性
float32 GetInertia() const;
14、取得世界点(取得给定相对于质心的点的世界坐标)
b2Vec2 GetWorldPoint(const b2Vec2& localPoint);
15、根据届出当前坐标系给的向量来得到世界向量
b2Vec2 GetWorldVector(const b2Vec2& localVector);
16、根据给定世界坐标来得到相对于质心的坐标