andEngine 物理引擎 box2d 使用说明.docx

上传人:b****6 文档编号:3639603 上传时间:2022-11-24 格式:DOCX 页数:12 大小:20.12KB
下载 相关 举报
andEngine 物理引擎 box2d 使用说明.docx_第1页
第1页 / 共12页
andEngine 物理引擎 box2d 使用说明.docx_第2页
第2页 / 共12页
andEngine 物理引擎 box2d 使用说明.docx_第3页
第3页 / 共12页
andEngine 物理引擎 box2d 使用说明.docx_第4页
第4页 / 共12页
andEngine 物理引擎 box2d 使用说明.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

andEngine 物理引擎 box2d 使用说明.docx

《andEngine 物理引擎 box2d 使用说明.docx》由会员分享,可在线阅读,更多相关《andEngine 物理引擎 box2d 使用说明.docx(12页珍藏版)》请在冰豆网上搜索。

andEngine 物理引擎 box2d 使用说明.docx

andEngine物理引擎box2d使用说明

andEngineBox2D物理引擎使用说明文档

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.*;

importBox2D.Common.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类型的对象。

*

*/

PublicclassMainextendsMovieClip

{

Publicvarm_world:

b2World;//世界对象

Publicvarm_iterations:

int=10;//跌代

Publicvarm_timeStep:

Number=1.0/24.0;//时间步

PublicfunctionMain()

{

//创建世界边界

VarworldAABB:

b2AABB=newb2AABB();

worldAABB.lowerBound.Set(-100.0,-100.0);//上限

worldAABB.upperBound.Set(100.0,100.0);//下限

//确定重力

Vargravity:

b2Vec2=newb2Vec2(0.0,10.0);

//允许引擎睡眠

VardoSleep:

Boolean=true;

//构建一个世界对象

m_world=newb2World(worldAABB,gravity,doSleep);//边界,重力,睡眠开关

//创建变量

Varbody:

b2Body;

VarbodyDef:

b2BodyDef;

VarboxDef:

b2PolygonDef;

VarcircleDef:

b2CircleDef;

//添加地表

bodyDef=newb2BodyDef();//物体

bodyDef.position.Set(10,12);//位置

boxDef=newb2PolygonDef();//多边形写义

boxDef.SetAsBox(30,3);//设定边框

boxDef.friction=0.3;//摩擦力

boxDef.density=0;//密度,静态物体需要0密度

bodyDef.userData=newPhysGround();//用户数据,可为显示对象,或为自己的对象

bodyDef.userData.width=30*2*30;//宽

bodyDef.userData.height=30*2*3;//高

addChild(bodyDef.userData);//添加至舞台

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;//位置:

X

bodyDef.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;//弹性

bodyDef.userData=newPhysBox();//用户数据

bodyDef.userData.width=rX*2*30;//宽

bodyDef.userData.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//弹性

bodyDef.userData=newPhysCircle();//用户数据

bodyDef.userData.width=rX*2*30;//宽

bodyDef.userData.height=rX*2*30;//高

body=m_world.CreateBody(bodyDef);//创建刚体

body.CreateShape(circleDef);//创建图形

}

body.SetMassFromShapes();//从图形创建质量

addChild(bodyDef.userData);//添加至舞台

}

//添加循环事件

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){//如果数据是一个sprite

bb.m_userData.x=bb.GetPosition().x*30;//设置X

bb.m_userData.y=bb.GetPosition().y*30;//设置Y

bb.m_userData.rotation=bb.GetAngle()*(180/Math.PI);//设置角度

}

}

}

}

}

说明:

Box2D会自动管理各个物体的碰撞,弹跳等物理状态,我们只需要创建各种刚体。

创建刚体可以通过b2BodyDef.userData来创建。

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的边界,它就会被冻结并停止模拟.

*********************************************************

//确定重力

Vargravity:

b2Vec2=newb2Vec2(0.0,10.0);

//允许引擎睡眠

VardoSleep:

Boolean=true;

接下来我们定义重力矢量.是的,你可以使重力朝向侧面(或者你只好转动你的显示器).并且,我们告诉世界(world)当物体停止移动时允许物体休眠.一个休眠中的物体不需要任何模拟.

*********************************************************

//构建一个世界对象

m_world=newb2World(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即是静态物体(障碍物)

*********************************************************

bodyDef.userData=newPhysGround();//用户数据

bodyDef.userData.width=30*2*30;//宽

bodyDef.userData.height=30*2*3;//高

addChild(bodyDef.userData);//添加至舞台

创建显示对象

*********************************************************

body=m_world.CreateBody(bodyDef);//创建物体

body.CreateShape(boxDef);//创建图形

body.SetMassFromShapes();//从图形创建质量

把显示对象写入世界坐标,再把虚拟属性写入显示对象,最后从图形创建质量

*********************************************************

 

Box2D简介(AS3版)

-----------------------------

/////////////////////////////////////////////////////////////////

Box2D.Collision包

b2AABBAABB坐标

b2OBBOBB坐标

b2ContactID接触ID

b2ContactPoint接触点

b2ManifoldPoint繁殖点

b2Segment线段

//////////////////////////////////////////////////////////////////

Box2D.Collision.Shapes

b2CircleDef圆外形定义.

b2CircleShape圆外形.

b2FilterData碰撞过滤器.

b2MassData质量运算器.

b2PolygonDef多边开定义.

b2PolygonShape凸多边形.

b2Shape外形基类.

b2ShapeDef外形定义基类.

//////////////////////////////////////////////////////////////////

Box2D.Common

b2Color调试绘图颜色.

b2Settings全局设置

//////////////////////////////////////////////////////////////////

Box2D.Common.Math

b2Mat222*2矩阵

b2Mat333*3矩阵

b2Sweep碰撞描述.

b2Vec2向量(x,y).

b2Vec3向量(x,yz).

b2XForm坐标转换,平移或旋转.

//////////////////////////////////////////////////////////////////

Box2D.Dynamics

b2Body刚体或叫物体.

b2BodyDef刚体定义.

b2BoundaryListener世界边界侦听.

b2ContactFilter继承这个类用来获取过滤碰撞

b2ContactListener继承这个类用来获取碰撞结果,根据这个判断游戏逻辑或声音处理.你也可以获取碰撞在时间步后,时间步会有一个碰撞列表.然而你也有可能漏掉一些碰撞,因为在一个时间步内有多个子步.

你应该尽量提高碰撞回调方法的效率,因为在每个时间步内有诸多回调.

b2DebugDraw调试绘图,用于调试.

b2DestructionListener关节或外形销毁时处理方法

b2World物理世界

//////////////////////////////////////////////////////////////////

Box2D.Dynamics.Contacts

b2Contact管理两个外形接触.

b2ContactEdge接触边用来连接多个物体和接触到一个接触表(物体是一个节点而接触相当于一个接触边)

b2ContactResult记录接触结果

//////////////////////////////////////////////////////////////////

Box2D.Dynamics.Joints

b2DistanceJoint距离校正器

b2DistanceJointDef距离连接定义.

b2GearJoint齿轮.

b2GearJointDef齿轮连接定义.

b2Joint连接基类.

b2JointDef连接定义基类.

b2JointEdge用于组合刚体或连接到一起.刚体相当于节点,而连接相当于边

b2MouseJoint鼠标连接.

b2MouseJointDef鼠标连接定义.

b2PrismaticJoint棱柱连接.

b2PrismaticJointDef棱柱连接定义.

b2PulleyJoint滑轮连接.

b2PulleyJointDef滑轮连接定义.

b2RevoluteJoint旋转连接.

b2RevoluteJointDef旋转连接定义.

//////////////////////////////////////////////////////////////////////////////////////////////

 

Box2D中的b2DebugDraw使用示例

b2DebugDraw提供调试功能,由于Box2D中所有对象都是不可见的,要创建可见对象我们得用刚体定义中的userData属性来创建自己的图形,如果不创建自己的图形,则用b2DebugDraw类来实现物体的可见,方便调试。

具体代码:

privatefunctionshowDebug():

void

{

//创建一个sprite,提供渲染

varm_sprite:

Sprite=newSprite();

addChild(m_sprite);

vardbgSprite:

Sprite=newSprite();

//给m_sprite添加一个子sprite

m_sprite.addChild(dbgSprite);

vardbgDraw:

b2DebugDraw=newb2DebugDraw();

//将m_sprite作为dbgDraw的渲染sprite

dbgDraw.m_sprite=m_sprite;

//设置比例为30,如果不设置则所有物体都会很小,box2D中以米为单位,1m=30像素

dbgDraw.m_drawScale=physScale;

//设置要显示的内容,每个标志代表一项

dbgDraw.m_drawFlags=b2DebugDraw.e_aabbBit|

b2DebugDraw.e_jointBit|

b2DebugDraw.e_obbBit|

b2DebugDraw.e_shapeBit;

//绘制刚体所用线条的透明度

dbgDraw.m_alpha=1;

//填充刚体所用颜色的透明度

dbgDraw.m_fillAlpha=0.3;

//绘制刚体所用线条的粗细

dbgDraw.m_lineThickness=1;

//从虚拟世界开始模拟

world.SetDebugDraw(dbgDraw);

}

b2DebugDraw类中有7个标志常量:

b2DebugDraw.e_aabbBit:

表示显示刚体的边界盒

b2DebugDraw.e_jointBit:

表示显示刚体相连时的节点和连线

b2DebugDraw.e_obbBit:

显示凸多边形的边界,不显示圆的边界

b2DebugDraw.e_pairBit:

drawbroad-phasepairs(不知如何翻译是好用原文)

b2DebugDraw.e_coreShapeBit:

drawcore(TOI)shapes

b2DebugDraw.e_shapeBit:

显示刚体的形状,不管是何种形状

b2DebugDraw.e_centerOfMassBit:

显示质量中心。

重心?

质心?

上面的代码我们可以设置绘制刚体的线条透明度,粗细,以及填充刚体颜色的透明度,但我们无法设置填充刚体所用的颜色,在Box2D中,默认有三中颜色来填充刚体,即红色,绿色,灰色。

红色---------表示已经处于休眠状态的刚体

绿色---------表示静止的刚体,没有密度质量的刚体

灰色---------表示正在移动的刚体

不过,我们可以修改b2World类中1060-1074行的代码来修改这三种默认的颜色,b2World中的代码如下:

for(s=b.GetShapeList();s;s=s.m_next)

{

if(b.IsStatic())

{

DrawShape(s,xf,newb2Color(0.5,0.9,0.5),core);

}

elseif(b.IsSleeping())

{

DrawShape(s,xf,newb2Color(0.5,0.5,0.9),core);

}

else

{

DrawShape(s,xf,newb2Color(0.9,0.9,0.9),core);

}

}这里实际是修改传递给b2Color实例的值,只需修改其构造函数中的三个对应的值即可。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1