加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

[Box2D]一.基础概念

发布时间:2020-12-15 18:11:43 所属栏目:百科 来源:网络整理
导读:点这看效果 世界(World) 你想要通过Box2D物理引擎控制的所有事物必须在世界(World)中。幸运的是,Box2D世界(World)拥有足够大的空间 来容纳你需要的任何事物,所以你无需担心世界(World)的边界(boundaries)。你只需要记住在电脑中的任何事物都 要


点这看效果



世界(World)

你想要通过Box2D物理引擎控制的所有事物必须在世界(World)中。幸运的是,Box2D世界(World)拥有足够大的空间

来容纳你需要的任何事物,所以你无需担心世界(World)的边界(boundaries)。你只需要记住在电脑中的任何事物都

要受到某种限制。所以,越大的世界(World),将会消耗你的电脑越多的资源去管理它


刚体(Rigid Bodies)

它是一块非常坚硬的物质,任何方法都不能使它弯曲。无论你怎样用力去撞击(Hit)或投掷(Throw)它,都无法改变它

的形状。在真实世界中,你可以将它的硬度想象成钻石,甚至比钻石还要硬。


刚体类型
有三种Box2D刚体的类型:staitc,dynamic和kinematic。


一个static类型的刚体不受任何力,冲量或撞击的影响并且不会移动。它只能通过用户手动移动。默认情况下,所有的Box2D

刚体都是static类型的刚体。一个static类型的刚体不会和别的static或kinematic类型的刚体发生碰撞。


一个dynamic类型的刚体受力,冲量,撞击以及任何世界事件的影响。它可以通过手动移动,也可以通过世界的重力,和任

何类型刚体的碰撞来移动。

一个kinematic类型的刚体是一个介于static和dynamic刚体之间的混合刚体。它不受力的影响,但是可以通过手动和设置它们

的速率来移动。它不能和static和kinematic类型的刚体碰撞


绘图(debug draw)时的不同颜色
static类型的刚体将会绘制成绿色。dynamic类型的刚体,当它们没有在睡眠状态时将会绘制成红色,在睡眠状态时将会绘制

成灰色。kinematic类型的刚体,它将会被显示为蓝色。


密度(density)用来设置刚体的质量,按照千克每立方米。越大的密度意味着越重的刚体,并且该值不能为负。

摩擦(friction)在两个刚体在彼此的表面上移动时产生,它是通过一个系数来定义的,通常它的范围在0到1之间(0表示没有摩擦)。

弹性(restitution)决定刚体在发生碰撞时反弹的程度。与密度(density)和摩擦(friction)一样,它不能为负数,范围在0到

1之间。一个弹性为0的小球,落向地面时,不发生反弹(无弹性碰撞),反之弹性为1的小球落向地面时,将会以此刻撞击时相同

的速率弹起(完全弹性碰撞)。


注册点

Box2D的注册点是中心,而不是左上角.


步骤:

1.下载Box2D,将源码拷贝到你的项目的src目录下,下载地址:http://www.box2dflash.org/

? ? 这里我下载是的Box2DFlash 2.1a(Flash 10)

2.新建一个类Basic_01,然后下面的代码拷贝到Basic_01.as文件中.

3.运行

package 
{	
	import Box2D.Collision.Shapes.b2CircleShape;
	import Box2D.Collision.Shapes.b2PolygonShape;
	import Box2D.Common.Math.b2Vec2;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2BodyDef;
	import Box2D.Dynamics.b2DebugDraw;
	import Box2D.Dynamics.b2FixtureDef;
	import Box2D.Dynamics.b2World;
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	[SWF(width="640",height="480")]
	public class Basic_01 extends Sprite {
		
		private var stageWidth:Number = 640;			//舞台宽度
		private var stageHeight:Number = 480;			//舞台高度
		private var backgroundColor:uint = 0x333333;	//背景色
		
		private var world:b2World;                //Box2D世界
		private var worldScale:Number = 30;        //一米等于30像素
		private var timeStep:Number = 1 / 30;    //时间步,世界将在每一个时间步被更新
		
		//只是定义了时间步还不够。在每一步,每一个物理实体(physic entity)根据作用
		//于自身的作用力来更新(不包括睡眠状态)。处理这项任务的算法叫约束解算器
		//(constraint solver)。它是基于循环每一个约束然后解算来进行的,一次一个。
		private var velIterations:int = 10;        //速率约束解算器
		private var posIterations:int = 10;        //位置约束解算器
		
		public function Basic_01() {
			drawBackground();
			var gravity:b2Vec2 = new b2Vec2(0,9.81);    //重力
			//世界中的刚体静止时,可以允许他们进入睡眠状态,睡眠的刚体无需模拟
			var sleep:Boolean = true;
			world = new b2World(gravity,sleep);
			
			var bodyDef:b2BodyDef = new b2BodyDef();   //刚体定义
			bodyDef.type = b2Body.b2_dynamicBody;	   //动态刚体
			//设置刚体坐标,Box2D坐标用米来表示,注册点是中心点 
			bodyDef.position.Set(stageWidth/2/worldScale,30/worldScale);      
			
			var circleShape:b2CircleShape = new b2CircleShape(25/worldScale); //半径为25像素的圆
			var fixtureDef:b2FixtureDef = new b2FixtureDef(); //夹具(fixture)用于将形状绑定到刚体上
			fixtureDef.density = 1;			//密度
			fixtureDef.restitution = 0.3;	//弹性系数
			fixtureDef.friction = 0.1;		//摩擦系数
			fixtureDef.shape = circleShape;
			
			var theBall:b2Body = world.CreateBody(bodyDef); //创建刚体
			theBall.CreateFixture(fixtureDef);
			
			//刚体定义(b2BodyDef)和夹具的定义(b2FixtureDef)可以重指定到我们定义的新的刚体
			bodyDef.type = b2Body.b2_staticBody;	//静态刚体
			bodyDef.position.Set(stageWidth/2/worldScale,(stageHeight - 10)/worldScale);
			
			var polygonShape:b2PolygonShape = new b2PolygonShape(); //创建多边形
			polygonShape.SetAsBox(stageWidth/2/worldScale,10/worldScale); //轴对称的矩形,半宽长和半高长
			
			fixtureDef.shape = polygonShape;
			
			var theFloor:b2Body = world.CreateBody(bodyDef);
			theFloor.CreateFixture(fixtureDef);
			
			debugDraw();
			
			addEventListener(Event.ENTER_FRAME,onUpdate);
		}
		
		private function debugDraw():void {
			var debugDraw:b2DebugDraw = new b2DebugDraw(); //调试绘图类
			var debugSprite:Sprite = new Sprite(); //显示调试绘图数据的画布
			addChild(debugSprite);
			debugDraw.SetSprite(debugSprite); //告知debugSprite将要被用来显示调试绘图
			debugDraw.SetDrawScale(worldScale);
			//允许我们决定将在调试绘图(debug draw)中描绘的物
			//理实体的类型。此刻,我们只需要绘制形状
			debugDraw.SetFlags(b2DebugDraw.e_shapeBit);
			debugDraw.SetFillAlpha(0.5);
			world.SetDebugDraw(debugDraw);    
		}
		
		private function onUpdate(e:Event):void {
			world.Step(timeStep,velIterations,posIterations);
			world.ClearForces();
			world.DrawDebugData();
		}
		
		private function drawBackground():void {
			graphics.beginFill(backgroundColor);
			graphics.drawRect(0,stageWidth,stageHeight);
			graphics.endFill();
		}
		
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读