andEngine 物理引擎 box2d 使用说明.docx
- 文档编号:3639603
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:12
- 大小:20.12KB
andEngine 物理引擎 box2d 使用说明.docx
《andEngine 物理引擎 box2d 使用说明.docx》由会员分享,可在线阅读,更多相关《andEngine 物理引擎 box2d 使用说明.docx(12页珍藏版)》请在冰豆网上搜索。
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实例的值,只需修改其构造函数中的三个对应的值即可。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- andEngine 物理引擎 box2d 使用说明 物理 引擎