11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 1889|回复: 0
上一主题 下一主题

[2D 物理引擎] 【9RIA—ladeng6666】—【Box2D系列教程 27】LDEasyBox2D使用说明

[复制链接] TA的其它主题
发表于 2018-2-6 11:11:24 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

转载:9RIA游戏开发者社区(天地会)
作者:ladeng6666(拉登大叔)
作者博客:http://www.ladeng6666.com/blog/


【Box2D系列教程-导航帖】—拉登大叔出品(总贴)


首先像关注我博客的兄弟们道歉,将近一个月没有更新教程了,今天我们继续。

看过我教程的同学都知道,我的教程里经常会用到LDEasyBox2D,也有人说,这对新手来说,理解起来有些困难。

其实LDEasyBox2D一点都不难,只不过是将我之前讲过的创建刚体的方法集成到了一个静态类中而已,今天我们就仔细看看LDEasyBox2D的内容。


属性
mouseJoint:当使用startDragBody()方法时,自动实例化这个鼠标关节,不需要特意创建
stage:当需要访问舞台的鼠标坐标时,会用到stage属性。需要在使用时,预先设置好这个属性
pixelPerMeter:每米转换成多少像素,默认为30

createWorld
功能:创建并返回一个重力为10牛的Box2D世界。
相关教程:认识box2d世界
参数说明:N/A
代码:

[Actionscript3] 纯文本查看 复制代码
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世界
代码:

[Actionscript3] 纯文本查看 复制代码
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对象
代码:

[Actionscript3] 纯文本查看 复制代码
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,创建好的矩形刚体
代码:

[Actionscript3] 纯文本查看 复制代码
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
返回值:返回一个圆形刚体
代码:

[Actionscript3] 纯文本查看 复制代码
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的舞台,若不指定该属性,将无法看到刚体的外观
返回值:返回一个多边形刚体
代码:

[Actionscript3] 纯文本查看 复制代码
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:要用静态墙体包围的舞台
代码:

[Actionscript3] 纯文本查看 复制代码
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世界
返回值:返回鼠标位置的刚体
代码:

[Actionscript3] 纯文本查看 复制代码
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
代码:

[Actionscript3] 纯文本查看 复制代码
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世界
代码:

[Actionscript3] 纯文本查看 复制代码
public static function stopDragBody(world:b2World):void {
	if (mouseJoint != null) {
		world.DestroyJoint(mouseJoint);
	}
}


注意,使用这个类之前,要先确保你已经准备好了Box2D 2.1a类库,然后将LDEasyBox2D静态来与Box2D类库放到同一个目录下,否则在编译时会提示找不到类文件。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表