LDEasyBox2D使用说明
首先像关注我博客的兄弟们道歉,将近一个月没有更新教程了,今天我们继续。
看过我教程的同学都知道,我的教程里经常会用到LDEasyBox2D,也有人说,这对新手来说,理解起来有些困难。
其实LDEasyBox2D一点都不难,只不过是将我之前讲过的创建刚体的方法集成到了一个静态类中而已,今天我们就仔细看看LDEasyBox2D的内容。
属性
- mouseJoint:当使用startDragBody()方法时,自动实例化这个鼠标关节,不需要特意创建
- stage:当需要访问舞台的鼠标坐标时,会用到stage属性。需要在使用时,预先设置好这个属性
- pixelPerMeter:每米转换成多少像素,默认为30
createWorld
功能:创建并返回一个重力为10牛的Box2D世界。
相关教程:认识box2d世界
参数说明:N/A
代码:
public static function createWorld():b2World { //2.声明重力 var gravity:b2Vec2 = new b2Vec2(0, 10); //3.睡着的对象是否模拟 var doSleep:Boolean = true; //4.创建b2World世界 var world:b2World = new b2World(gravity, doSleep); return world; }
updateWorld
功能:更新Box2D世界。世界里刚体的useData也会同步更新;用startDragBody创建的鼠标关节也会自动更新。
相关教程:认识box2d世界,让刚体听我的——鼠标拖动Box2D刚体,刚体的上衣——b2BodyDef.userData
参数说明:
- world:承载所有刚体的Box2D世界
代码:
public static function updateWorld(world:b2World):void { world.Step(1 / pixelPerMeter, 10, 10); world.ClearForces(); world.DrawDebugData(); for (var body:b2Body = world.GetBodyList(); body; body=body.GetNext()) { if (body.GetUserData() != null) { //根据刚体的坐标个角度,更新绑定的userData body.GetUserData().x = body.GetPosition().x * pixelPerMeter; body.GetUserData().y = body.GetPosition().y * pixelPerMeter; body.GetUserData().rotation = body.GetAngle() * 180 / Math.PI; } } if (mouseJoint != null) { var mouseVector:b2Vec2 = new b2Vec2(stage.mouseX / pixelPerMeter, stage.mouseY / pixelPerMeter); mouseJoint.SetTarget(mouseVector); } }
createDebug
功能:创建Box2D Debug对象,调试Box2D应用。
相关教程:掉落的苹果——b2Body刚体
参数说明:
- world:承载所有刚体的Box2D世界
- 返回值:用来绘制Box2D调试图的sprite对象
代码:
public static function createDebug(world:b2World):Sprite { var debugSprite:Sprite = new Sprite(); var debugDraw:b2DebugDraw = new b2DebugDraw(); debugDraw.SetSprite(debugSprite); debugDraw.SetDrawScale(pixelPerMeter); debugDraw.SetFillAlpha(0.8); debugDraw.SetLineThickness(1.0); debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit); world.SetDebugDraw(debugDraw); return debugSprite; }
createBox
功能:创建并返回一个矩形的b2Body刚体对象。
相关教程:掉落的苹果——b2Body刚体,刚体的上衣——b2BodyDef.userData
参数说明:
- world:承载所有刚体和关节的世界
- posX:刚体的x坐标,以像素为单位
- posY:刚体的y坐标,以像素为单位
- boxWidth:刚体的宽度,以像素为单位
- boxHeight:刚体的高度,以像素为单位
- isStatic:刚体是否静止不动,默认为false
- userData:刚体的外观,默认为null
- 返回值:b2Body,创建好的矩形刚体
代码:
public static function createBox(world:b2World,posX:Number,posY:Number,boxWidth:Number,boxHeight:Number,isStatic:Boolean=false,userData:*=null):b2Body { //1.创建刚体需求b2BodyDef var bodyRequest:b2BodyDef = new b2BodyDef(); bodyRequest.type = isStatic? b2Body.b2_staticBody:b2Body.b2_dynamicBody; bodyRequest.position.Set(posX / pixelPerMeter, posY / pixelPerMeter);//记得米和像素的转换关系 //Ladeng6666是Flash元件库中的一个图片 if ( userData != null) { bodyRequest.userData = userData; //设定上衣的尺寸 bodyRequest.userData.width = boxWidth; bodyRequest.userData.height = boxHeight; //需手动将上衣添加到舞台上 //addChild(bodyRequest.userData); } //2.创建形状 var shapeBox:b2PolygonShape = new b2PolygonShape(); shapeBox.SetAsBox(boxWidth / pixelPerMeter / 2, boxHeight / pixelPerMeter / 2); //2.Box2D世界工厂更具需求创建createBody()生产刚体 var box:b2Body = world.CreateBody(bodyRequest); //3.创建敢提形状需求b2ShapeDef的子类 var fixtureRequest:b2FixtureDef = new b2FixtureDef(); fixtureRequest.density = 3; fixtureRequest.friction = 0.3; fixtureRequest.restitution = 0.2; fixtureRequest.shape = shapeBox; //4.b2Body刚体工厂根据需求createShape生产形状 box.CreateFixture(fixtureRequest); return box; }
createCircle
功能:创建并返回一个圆形敢提,同样所有涉及到坐标的参数都是以像素为单位。
相关教程:创建圆形刚体,刚体的上衣——b2BodyDef.userData
参数说明:
- world:承载所有刚体的Box2D世界
- posX:刚体的x坐标,以像素为单位
- posY:刚体的y坐标,以像素为单位
- radius:刚体的半径,以像素为单位
- isStatic:刚体是否为静止对象,默认为false
- userData:刚体的外观,默认为null
- 返回值:返回一个圆形刚体
代码:
public static function createCircle(world:b2World, posX:Number, posY:Number, radius:Number, isStatic:Boolean = false, userData:*=null):b2Body { //1.创建刚体需求b2BodyDef var bodyRequest:b2BodyDef = new b2BodyDef(); bodyRequest.type = isStatic? b2Body.b2_staticBody:b2Body.b2_dynamicBody; bodyRequest.position.Set(posX / pixelPerMeter, posY / pixelPerMeter);//记得米和像素的转换关系 //Ladeng6666是Flash元件库中的一个图片 if ( userData != null) { bodyRequest.userData = userData; //设定上衣的尺寸 bodyRequest.userData.width = radius*2; bodyRequest.userData.height = radius*2; //需手动将上衣添加到舞台上 //addChild(bodyRequest.userData); } //2.创建形状 var shapeCircle:b2CircleShape = new b2CircleShape(); shapeCircle.SetRadius(radius/pixelPerMeter); //2.Box2D世界工厂更具需求创建createBody()生产刚体 var circle:b2Body = world.CreateBody(bodyRequest); //3.创建敢提形状需求b2ShapeDef的子类 var fixtureRequest:b2FixtureDef = new b2FixtureDef(); fixtureRequest.density = 3; fixtureRequest.friction = 0.3; fixtureRequest.restitution = 0.2; fixtureRequest.shape = shapeCircle; //4.b2Body刚体工厂根据需求createShape生产形状 circle.CreateFixture(fixtureRequest); return circle; }
createPolygon
功能:根据一组顶点数据,创建多边形刚体,可以是顺时针绘制,也可以逆时针绘制,但不能出现交叉。
相关教程:Box2D多边形刚体贴图,运行时创建多边形刚体
参数说明:
- world:Box2D世界
- vertices:顶点数组,顶点之间不能有交叉
- isStatic:是否为静止的刚体
- fillData:刚体的填充纹理,一个BitmapData对象,请确保整个BitmapData的尺寸大于舞台的尺寸
- stage:添加userData的舞台,若不指定该属性,将无法看到刚体的外观
- 返回值:返回一个多边形刚体
代码:
public static function createPolygon(world:b2World, vertices:Vector.<b2Vec2>, isStatic:Boolean = false, fillData:BitmapData = null,stage:DisplayObjectContainer=null):b2Body { //1.创建刚体需求b2BodyDef var bodyRequest:b2BodyDef = new b2BodyDef(); bodyRequest.type = isStatic? b2Body.b2_staticBody:b2Body.b2_dynamicBody; bodyRequest.position.Set(0 , 0);//记得米和像素的转换关系 //3.创建敢提形状需求b2ShapeDef的子类 //创建矩形刚体形状需求 var fixtureRequest:b2FixtureDef = new b2FixtureDef(); fixtureRequest.density = 3; fixtureRequest.friction = 0.3; fixtureRequest.restitution = 0.2; //创建一个Separator对象 var separator:b2Separator = new b2Separator(); //验证顶点是否符合创建多边形的标准 var validate:int = separator.Validate(vertices); //如果是顶点因非顺时针不符标准,则反转数组中的顶点顺序 if (validate == 2) { vertices.reverse(); }else if (validate != 0) { //如果不符合多边形标准,跳出 return null; } if (fillData != null && stage!=null) { var userData:Sprite = new Sprite(); var commandVector:Vector.<int> = new Vector.<int>(); var posVector:Vector.<Number> = new Vector.<Number>(); commandVector.push(1); posVector.push(vertices[0].x * pixelPerMeter); posVector.push(vertices[0].y * pixelPerMeter); for (var i:int = 1; i < vertices.length;i++ ) { commandVector.push(2) posVector.push(vertices[i].x * pixelPerMeter); posVector.push(vertices[i].y * pixelPerMeter); } userData.graphics.beginBitmapFill(fillData); userData.graphics.drawPath(commandVector, posVector); userData.graphics.endFill(); stage.addChild(userData); bodyRequest.userData = userData; } //2.Box2D世界工厂更具需求创建createBody()生产刚体 var body:b2Body=world.CreateBody(bodyRequest); //将顶点分解成多个凸多边形,组合成复杂的多边形 separator.Separate(body, fixtureRequest, vertices); return body; }
createWrapWall
功能:在Box2D世界中创建围绕canvas四周的静态墙体
相关教程:创建静止不动的刚体
参数说明:
- world:承载所有刚体的Box2D世界
- canvas:要用静态墙体包围的舞台
代码:
public static function createWrapWall(world:b2World,canvas:DisplayObject):void { var w:Number = canvas.width; var h:Number = canvas.height; var wallThick:Number = 20;//in pixels createBox(world, w / 2, 0, w , wallThick, true); createBox(world, w / 2, h, w , wallThick, true); createBox(world, 0, h / 2, wallThick, h , true); createBox(world, w, h / 2, wallThick, h , true); }
getBodyAtMouse
功能:获取Box2D世界中鼠标下的刚体。
相关教程:让刚体听我的——鼠标拖动Box2D刚体
参数说明:
- world:承载所有刚体和关节的Box2D世界
- 返回值:返回鼠标位置的刚体
代码:
public static function getBodyAtMouse(world:b2World):b2Body { evaluateStage(); //转换鼠标坐标单位,除以30从m该为px var mouseVector:b2Vec2 = new b2Vec2(stage.mouseX / pixelPerMeter, stage.mouseY / pixelPerMeter); //鼠标下的刚体 var bodyAtMouse:b2Body = null; //queryPoint函数中要用到的回调函数,注意,它必须有一个b2Fixture参数 function callBack(fixture:b2Fixture):void { if ( fixture == null) return; //如果fixture不为null,设置为鼠标下的刚体 bodyAtMouse = fixture.GetBody(); } //利用QueryPoint方法查找鼠标滑过的刚体 world.QueryPoint(callBack, mouseVector); //返回找到的刚体 return bodyAtMouse; }
startDragBody
功能:用鼠标关节拖动刚体。
相关教程:让刚体听我的——鼠标拖动Box2D刚体
参数说明:
- world:承载所有刚体和关节的Box2D世界
- body:要拖动的刚体
- maxForce:鼠标关节允许的最大作用力,默认为1000
代码:
public static function startDragBody(world:b2World,body:b2Body,maxForce:Number=1000):void { evaluateStage() if (body == null) return;//如果鼠标下的刚体不为空 //创建鼠标关节需求 var mouseJointDef:b2MouseJointDef = new b2MouseJointDef(); mouseJointDef.bodyA = world.GetGroundBody();//设置鼠标关节的一个节点为空刚体,GetGroundBody()可以理解为空刚体 mouseJointDef.bodyB = body//设置鼠标关节的另一个刚体为鼠标点击的刚体 mouseJointDef.target.Set(stage.mouseX / pixelPerMeter, stage.mouseY / pixelPerMeter);//更新鼠标关节拖动的点 mouseJointDef.maxForce = maxForce;//设置鼠标可以施加的最大的力 //创建鼠标关节 mouseJoint=world.CreateJoint(mouseJointDef) as b2MouseJoint; }
startDragBody
功能:停止拖动world中的刚体。
相关教程:让刚体听我的——鼠标拖动Box2D刚体
参数说明:
- world:承载所有刚体和关节的Box2D世界
代码:
public static function stopDragBody(world:b2World):void { if (mouseJoint != null) { world.DestroyJoint(mouseJoint); } }
注意,使用这个类之前,要先确保你已经准备好了Box2D 2.1a类库,然后将LDEasyBox2D静态来与Box2D类库放到同一个目录下,否则在编译时会提示找不到类文件。
联系作者
谢谢拉登叔~这个类文件给我的box2D学习带来了很大的方便。只是在做游戏的时候遇到一个问题,比如我继承了一个碰撞监听的类,当我设定两个特定刚体碰撞时,摧毁刚体,但是发现摧毁刚体的语句没有任何效果,前面移除userdata的几句代码也能执行,这是为什么呢?box2D摧毁刚体有什么必要条件呢?
谢谢你的关注,你的问题我不是很理解,你可以把源文件发到我的邮箱里吗?这样我可以更好的明白你的问题。我的邮箱是:ladeng6666@163.com
演示文件已经发了,问题能明白么?
感谢拉登叔的帮忙。虽然是小问题,之前在网上搜索很久,但是没高手帮忙总是有种求助无门的感觉。
var separator:b2Separator = new b2Separator();
新版本里,似乎没有 b2Separator 类了?用哪个代替?
这不是Box2D带的,是国外高手写的,你可以在我的其他教程里下载到,谢谢关注
谢谢哦,不再迷茫了
LDEasyBox2D.getBodyAtMouse()下的
function callBack( fixture:b2Fixture ):void
编译错误:找不到类型或不是编译时常数。
拉登兄这是怎么回事 给看看呗
5.0 版的
用的是FlashCS5.5
function callBack( fixture:b2Fixture ):void 那个问题好了
还有一个重要问题 import Box2D.Box2DSeparator.b2Separator; 这个东东没有呀
这是国外牛人写的一个类,可以在Box2D多边形刚体贴图这篇教程里找到
提示什么错误?白天基本不上网,有问题给我发邮件吧,我的邮箱:ladeng6666@163.com
受益匪浅。。。
用你的这个函数createWrapWall,传进来的stage的w和h都是0,是怎么回事啊
代码里我写的是width和height,把它们分别改成stageWidth和stageHeight就好了。
对flash基本的知识还不是很了解。就来学习box2d了,呵呵。