box2d系列之 加冲力(impulse)

来源:互联网 发布:php微信支付代码 编辑:程序博客网 时间:2024/04/28 14:49

//新建两个影片剪辑 :一个的连接名为: Ground  一个为Box

下面是codes

 

package {
 import Box2D.Collision.*;
 import Box2D.Collision.Shapes.*;
 import Box2D.Common.Math.*;
 import Box2D.Dynamics.*;
 import Box2D.Dynamics.Joints.*;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 public class MyBox2d extends Sprite {
  private var m_world:b2World;
  private var m_timeStep:Number;
  private var m_iterations:uint;
  private var phsScale:uint=30;
  private var AABB:b2AABB;
  private var body:b2Body;
  private var bodyDef:b2BodyDef;
  private var gravity:b2Vec2;
  private var boxDef:b2PolygonDef;
  /*
   *  @author :Dream@Night~夜梦惊魂
   *
   */
  public function MyBox2d() {
   m_timeStep=1.0/30.0;
   m_iterations=10;
   createWorld();
   createGround();
   createBox();
   addEventListener(Event.ENTER_FRAME,Update,false,0,true);
   stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
   trace(this.getChildAt(1));//测试表明对象没有添加进舞台
   //stage.addEventListener(MouseEvent.MOUSE_UP,onUp);
  }
  private function createWorld():void {
   AABB= new b2AABB();
   AABB.lowerBound.Set(-100.0, -100.0);
   AABB.upperBound.Set(100.0, 100.0);
   gravity=new b2Vec2(0,10.0);
   //gravity.Set(0,10.0);
   m_world=new b2World(AABB,gravity,true);
  }
  private function createGround():void {
   bodyDef = new b2BodyDef();
   var X:Number= 20/(phsScale*2);
   var Y:Number= 700/(phsScale*2);
   bodyDef.position.Set(X,Y);
   boxDef = new b2PolygonDef ();
   boxDef.vertexCount=4;
   boxDef.density=0;
   boxDef.restitution=0.2;
   boxDef.friction=0.3;
   boxDef.SetAsBox(30,2);
   bodyDef.userData= new Ground();//Ground
   bodyDef.userData.width=30*2*phsScale;
   bodyDef.userData.height=2*2*phsScale;
   body=m_world.CreateBody(bodyDef);
   body.CreateShape(boxDef);
   body.SetMassFromShapes();
   addChild(bodyDef.userData);
  }
  private function createBox():void {
   for (var i:uint=0; i<5; ++i) {
    bodyDef = new b2BodyDef();
    bodyDef.position.x=Math.random()*15+1;
    bodyDef.position.y=Math.random();
    var crate_width:Number=1.5;
    var crate_height:Number=1.5;
    boxDef = new b2PolygonDef();
    boxDef.SetAsBox(crate_width, crate_height);
    boxDef.density=1.0;
    boxDef.friction=0.5;
    boxDef.restitution=0.2;
    bodyDef.userData = new Box();
    bodyDef.userData.width=crate_width*2*phsScale;
    bodyDef.userData.height=crate_height*2*phsScale;
    body=m_world.CreateBody(bodyDef);
    body.CreateShape(boxDef);
    body.SetMassFromShapes();
    addChild(bodyDef.userData);

   }
  }
  private function onDown(e:MouseEvent):void {
   var body=getBodyAtMouse();
   if (body) {
    body.WakeUp();
    //添加向上的冲力
    var impulse:b2Vec2=new b2Vec2(0,-80);
    body.ApplyImpulse(impulse,body.GetWorldCenter());
    if (Math.random()<0.382) {
     body.ApplyTorque(450);
    } else {
     body.ApplyTorque(-450);
    }
   }
  }
  private function getBodyAtMouse():b2Body {
   var body:b2Body;
   var mouseBox2dX=stage.mouseX/phsScale;
   var mouseBox2dY=stage.mouseY/phsScale;
   var mousePosition:b2Vec2=new b2Vec2(mouseBox2dX,mouseBox2dY);
   var AABB:b2AABB= new b2AABB();
   AABB.lowerBound.Set(mouseBox2dX-0.001,mouseBox2dY-0.001);
   AABB.upperBound.Set(mouseBox2dX+0.001,mouseBox2dY+0.001);
   var shapes:Array= new Array();
   var maxCount:uint=6;
   var count:int=m_world.Query(AABB,shapes,maxCount);
   for (var i:uint=0; i<count; i++) {
    if (shapes[i].m_body.IsStatic()==false) {
     var shape=shapes[i] as b2Shape;
     var shapeXform=shape.m_body.GetXForm();
     var inside:Boolean=shape.TestPoint(shapeXform,mousePosition);
     if (inside) {
      body=shape.m_body;
     }
    }

   }
   return body;
  }
  //释放内存
  private function onUp(e:MouseEvent):void {
   trace("nothing to be done !");
  }
  //直接copy这个模板
  private function Update(e:Event):void {
   m_world.Step(m_timeStep, m_iterations);

   // Go through body list and update sprite positions/rotations 
   for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
    if (bb.m_userData is Sprite) {
     bb.m_userData.x=bb.GetPosition().x*30;
     bb.m_userData.y=bb.GetPosition().y*30;
     bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
    }
   }

  }


 }
}

 

 

 

demo :    http://11611.jjii.net/swf/MyDoneB2.swf 

 

 

 

 

原创粉丝点击