BOX2D说明

  • 格式:doc
  • 大小:66.50 KB
  • 文档页数:10

Box2D物理引擎Box2d是一个很出名的2d物理引擎,大家可以google之。

Box2d有C++,flash和Java等版本。

android 可以直接使用java版本的Jbox2d,但因为Jbox2d的图形渲染是使用processing库来实现的,所以,在android中使用Jbox2d的时候,图形渲染的工作就只能自己来写了。

因为网上关于box2d的资料真的非常的少,特别是关于图形绘制方面package{importflash.display.MovieClip;importBox2D.Dynamics.*;importBox2D.Collision.*;importBox2D.Collision.Shapes.*;mon.Math.*;importflash.events.Event;importflash.display.Sprite;importflash.events.MouseEvent;/***date:2009.3.18*BOX2D测试*@authorcwin5***全局的对象的构造函数作了三件事情:*1、一个在b2AABB类中的实例构建的坐标系统*2、一个定义重力的向量,这是一个b2Vec2类构建的实例。

*3、一个布尔变量来定义对象是否"沉迷"。

(设置如果你为true,对象将会沉迷)。

**执行Step()函数,每一帧都会更新所有的Body在world中的位置。

***虽然现在的world中是空的,但是你可以往里面添加任何的球体或者盒子,以及你想到的任何形状的东西,我们需要定义一个Body。

*一个body体大概需要做2-4件事情:***1、定义一个形状。

*2、一个(x,y)的位置*下面的定义可选:*3、角度*4、一个预制的Sprite对象。

**在Box2DFlash的例子中,你可能注意到所有的形状都是简单的。

这是因为所有的东西在每一帧都是被线条重绘。

*如果你想在你的游戏或者其他的什么中具有一些有特色的东西,你可以通过综合形状定义Body 来制作一个Sprite**形状的定义,我们有3种类型的形状定义,他们都是扩展的b2ShapeDef基类。

**我们先来说b2BoxDef类,这个具有4个重要的属性:*1、SetAsBox(设定边框):这是一个向量,本质上说他就是一个形状的中心坐标*2、Density(密度):在碰撞的等式中我们使用密度*面积=质量,密度如果是0或者null,将会是一个静止的对象。

*3、Friction(摩擦力):这用来计算两个对象之间的摩擦,你可以在0.0-1.0之间调整它们。

*4、Restitution(弹性):这是调整对象弹性程度的属性,你可以在0.0-1.0之间调整它们。

*b2CircleDef类中有一个不同的属性,代替SetAsBox是他的Radius(半径)。

*b2PolyDef类具有一个顶点数组(最大是8)来代替SetAsBox和Radius。

这些顶点都是b2Vec2类型的对象。

**/Public class Main extends MovieClip{Public var m_world:b2World;//世界对象Public var m_iterations:int=10;//跌代Public var m_timeStep:Number=1.0/24.0;//时间步Public function Main(){//创建世界边界Var worldAABB:b2AABB=new b2AABB();worldAABB.lowerBound.Set(-100.0,-100.0);//上限worldAABB.upperBound.Set(100.0,100.0);//下限//确定重力Var gravity:b2Vec2=newb2Vec2(0.0,10.0);//允许引擎睡眠Var doSleep:Boolean=true;//构建一个世界对象m_world=new b2World(worldAABB,gravity,doSleep);//边界,重力,睡眠开关//创建变量Var body:b2Body;Var bodyDef:b2BodyDef;Var boxDef:b2PolygonDef;Var circleDef:b2CircleDef;//添加地表bodyDef=new b2BodyDef();//物体bodyDef.position.Set(10,12);//位置boxDef=newb2PolygonDef();//多边形写义boxDef.SetAsBox(30,3);//设定边框boxDef.friction=0.3;//摩擦力boxDef.density=0;//密度,静态物体需要0密度erData=newPhysGround();//用户数据,可为显示对象,或为自己的对象erData.width=30*2*30;//宽erData.height=30*2*3;//高addChild(erData);//添加至舞台body=m_world.CreateBody(bodyDef);//创建刚体body.CreateShape(boxDef);//创建图形body.SetMassFromShapes();//从图形创建质量//添加一些对象for(vari:int=1;i<10;i++){bodyDef=newb2BodyDef();//刚体定义bodyDef.position.x=Math.random()*15+5;//位置:XbodyDef.position.y=Math.random()*10;//位置:Y//取随机边框参数varrX:Number=Math.random()+0.5;varrY:Number=Math.random()+0.5;//盒(方块)if(Math.random()<0.5){//取随机数boxDef=newb2PolygonDef();//多边形boxDef.SetAsBox(rX,rY);//设定边框boxDef.density=1.0;//密度boxDef.friction=0.5;//摩擦力boxDef.restitution=0.2;//弹性erData=newPhysBox();//用户数据erData.width=rX*2*30;//宽erData.height=rY*2*30;//高body=m_world.CreateBody(bodyDef);//创建刚体body.CreateShape(boxDef);//创建BOX2D里的图形}//圆else{circleDef=newb2CircleDef();//圆形circleDef.radius=rX;//半径circleDef.density=1.0;//密度circleDef.friction=0.5;//摩擦力circleDef.restitution=0.2//弹性erData=newPhysCircle();//用户数据erData.width=rX*2*30;//宽erData.height=rX*2*30;//高body=m_world.CreateBody(bodyDef);//创建刚体body.CreateShape(circleDef);//创建图形}body.SetMassFromShapes();//从图形创建质量addChild(erData);//添加至舞台}//添加循环事件addEventListener(Event.ENTER_FRAME,Update,false,0,true);}publicfunctionUpdate(e:Event):void{m_world.Step(m_timeStep,m_iterations);//刷新物理世界//通过刚体列表更新Sprite的位置/角度for(varbb:b2Body=m_world.m_bodyList;bb;bb=bb.m_next){//声明bb=世界对象的刚体列表;//bb(如果为空值,即null,0,underfind),则不运行,//bb=bb.m_next(下一个值为它的m_next)if(bb.m_userDataisSprite){//如果数据是一个spritebb.m_userData.x=bb.GetPosition().x*30;//设置Xbb.m_userData.y=bb.GetPosition().y*30;//设置Ybb.m_userData.rotation=bb.GetAngle()*(180/Math.PI);//设置角度}}}}}说明:Box2D会自动管理各个物体的碰撞,弹跳等物理状态,我们只需要创建各种刚体。

创建刚体可以通过erData来创建。

b2Shape.SetAsBox(width,height)指的是物体的半宽和半高,所以在计算时都要乘以2。

由于Box2D本身的限制,运算时要进行长度换算。

1创建一个世界(边界,重力,休眠开关)*********************************************************//创建世界边界varworldAABB:b2AABB=newb2AABB();worldAABB.lowerBound.Set(-100.0,-100.0);//上限worldAABB.upperBound.Set(100.0,100.0);//下限worldAABB应该永远比物体所在的区域要大,让worldAABB更大总比太小要好.如果一个物体到达了worldAABB的边界,它就会被冻结并停止模拟.*********************************************************//确定重力Var gravity:b2Vec2=new b2Vec2(0.0,10.0);//允许引擎睡眠Var doSleep:Boolean=true;接下来我们定义重力矢量.是的,你可以使重力朝向侧面(或者你只好转动你的显示器).并且,我们告诉世界(world)当物体停止移动时允许物体休眠.一个休眠中的物体不需要任何模拟.*********************************************************//构建一个世界对象m_world=new b2World(worldAABB,gravity,doSleep);//边界,重力,睡眠开关那么现在我们有了自己的物理世界,让我们再加些东西进*********************************************************2创建一个地面盒或者物体*********************************************************1.使用位置(position),阻尼(damping)等定义一个物体2.使用世界对象创建物体3.使用几何结构,摩擦,密度等定义形状4.在物体上创建形状5.可选地调整物体的质量以和附加的形状相匹配********************************************************* bodyDef=newb2BodyDef();//刚体定义bodyDef.position.Set(10,12);//位置设定位置*********************************************************boxDef=newb2PolygonDef();//多边形定义boxDef.SetAsBox(30,3);//设定边框boxDef.friction=0.3;//摩擦力boxDef.density=0;//密度,静态物体需要0密度设定虚拟属性,密度为0即是静态物体(障碍物)********************************************************* erData=new PhysGround();//用户数据erData.width=30*2*30;//宽erData.height=30*2*3;//高addChild(erData);//添加至舞台创建显示对象*********************************************************body=m_world.CreateBody(bodyDef);//创建物体body.CreateShape(boxDef);//创建图形body.SetMassFromShapes();//从图形创建质量把显示对象写入世界坐标,再把虚拟属性写入显示对象,最后从图形创建质量*********************************************************Box2D简介(AS3版)-----------------------------///////////////////////////////////////////////////////////////// Box2D.Collision 包b2AABB AABB坐标b2OBB OBB坐标b2ContactID 接触IDb2ContactPoint 接触点b2ManifoldPoint 繁殖点b2Segment 线段////////////////////////////////////////////////////////////////// Box2D.Collision.Shapesb2CircleDef 圆外形定义.b2CircleShape 圆外形.b2FilterData 碰撞过滤器.b2MassData 质量运算器.b2PolygonDef 多边开定义.b2PolygonShape 凸多边形.b2Shape 外形基类.b2ShapeDef 外形定义基类.////////////////////////////////////////////////////////////////// monb2Color 调试绘图颜色.b2Settings 全局设置////////////////////////////////////////////////////////////////// mon.Mathb2Mat22 2*2 矩阵b2Mat33 3*3 矩阵b2Sweep 碰撞描述.b2V ec2 向量(x ,y).b2Vec3向量(x, y z).b2XForm 坐标转换,平移或旋转.////////////////////////////////////////////////////////////////// Box2D.Dynamicsb2Body 刚体或叫物体.b2BodyDef 刚体定义.b2BoundaryListener 世界边界侦听.b2ContactFilter 继承这个类用来获取过滤碰撞b2ContactListener 继承这个类用来获取碰撞结果,根据这个判断游戏逻辑或声音处理. 你也可以获取碰撞在时间步后,时间步会有一个碰撞列表.然而你也有可能漏掉一些碰撞,因为在一个时间步内有多个子步.你应该尽量提高碰撞回调方法的效率,因为在每个时间步内有诸多回调.b2DebugDraw 调试绘图,用于调试.b2DestructionListener 关节或外形销毁时处理方法b2World 物理世界//////////////////////////////////////////////////////////////////Box2D.Dynamics.Contactsb2Contact 管理两个外形接触.b2ContactEdge 接触边用来连接多个物体和接触到一个接触表(物体是一个节点而接触相当于一个接触边)b2ContactResult 记录接触结果//////////////////////////////////////////////////////////////////Box2D.Dynamics.Jointsb2DistanceJoint 距离校正器b2DistanceJointDef 距离连接定义.b2GearJoint 齿轮.b2GearJointDef 齿轮连接定义.b2Joint 连接基类.b2JointDef 连接定义基类.b2JointEdge 用于组合刚体或连接到一起.刚体相当于节点,而连接相当于边b2MouseJoint 鼠标连接.b2MouseJointDef 鼠标连接定义.b2PrismaticJoint 棱柱连接.b2PrismaticJointDef 棱柱连接定义.b2PulleyJoint 滑轮连接.b2PulleyJointDef 滑轮连接定义.b2RevoluteJoint 旋转连接.b2RevoluteJointDef 旋转连接定义.//////////////////////////////////////////////////////////////////////////////////////////////Box2D中的b2DebugDraw使用示例b2DebugDraw提供调试功能,由于Box2D中所有对象都是不可见的,要创建可见对象我们得用刚体定义中的userData属性来创建自己的图形,如果不创建自己的图形,则用b2DebugDraw类来实现物体的可见,方便调试。