قبلا در مورد Box2D مطلب کوتاهی نوشتم در مثال زیر روش drag کردن اجسام را نشان می دهم.
با تغییر در کد خط 89 یعنی مقدار mouse_joint.maxForce مي توان روي قىرت پرتاب اجسام توسط mouse اثر گذاشت.
با تغییر در کد خط 89 یعنی مقدار mouse_joint.maxForce مي توان روي قىرت پرتاب اجسام توسط mouse اثر گذاشت.
package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import Box2D.Dynamics.*;
 import Box2D.Collision.*;
 import Box2D.Collision.Shapes.*;
 import Box2D.Common.Math.*;
 import Box2D.Dynamics.Joints.*;
 public class cratetest extends Sprite {
  public var m_world:b2World;
  public var m_iterations:int = 10;
  public var m_timeStep:Number = 1/30;
  public var mousePVec:b2Vec2 = new b2Vec2();
  public var real_x_mouse:Number;
  public var real_y_mouse:Number;
  public var pixels_in_a_meter = 30;
  public var worldAABB:b2AABB = new b2AABB();
  public var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
  public var mouseJoint:b2MouseJoint;
  public function cratetest() {
   addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
   stage.addEventListener(MouseEvent.MOUSE_DOWN, on_mouse_down);
   stage.addEventListener(MouseEvent.MOUSE_UP, on_mouse_up);
   worldAABB.lowerBound.Set(-100.0, -100.0);
   worldAABB.upperBound.Set(100.0, 100.0);
   m_world = new b2World(worldAABB, gravity, true);
   var body:b2Body;
   var bodyDef:b2BodyDef;
   var boxDef:b2PolygonDef;
   bodyDef = new b2BodyDef();
   bodyDef.position.Set(8.5, 13.5);
   boxDef = new b2PolygonDef();
   var ground_width = 8.5;
   var ground_height = 0.5;
   boxDef.SetAsBox(ground_width, ground_height);
   boxDef.friction = 0.3;
   boxDef.density = 0;
   bodyDef.userData = new floor();
   bodyDef.userData.width = ground_width * 2 * pixels_in_a_meter;
   bodyDef.userData.height = ground_height * 2 * pixels_in_a_meter;
   addChild(bodyDef.userData);
   body = m_world.CreateBody(bodyDef);
   body.CreateShape(boxDef);
   body.SetMassFromShapes();
   for (var i:int = 1; 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 crate();
    bodyDef.userData.width = crate_width * 2 * pixels_in_a_meter;
    bodyDef.userData.height = crate_height * 2* pixels_in_a_meter;
    body = m_world.CreateBody(bodyDef);
    body.CreateShape(boxDef);
    body.SetMassFromShapes();
    addChild(bodyDef.userData);
   }
  }
  public function Update(e:Event):void {
   m_world.Step(m_timeStep, m_iterations);
   if (mouseJoint) {
    var mouseXWorldPhys = mouseX/pixels_in_a_meter;
    var mouseYWorldPhys = mouseY/pixels_in_a_meter;
    var p2:b2Vec2 = new b2Vec2(mouseXWorldPhys, mouseYWorldPhys);
    mouseJoint.SetTarget(p2);
   }
   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 * pixels_in_a_meter;
     bb.m_userData.y = bb.GetPosition().y * pixels_in_a_meter;
     bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
    }
   }
  }
  public function on_mouse_down(evt:MouseEvent):void {
   var body:b2Body = GetBodyAtMouse();
   if (body) {
    var mouse_joint:b2MouseJointDef = new b2MouseJointDef;
    mouse_joint.body1 = m_world.GetGroundBody();
    mouse_joint.body2 = body;
    mouse_joint.target.Set(mouseX/pixels_in_a_meter, mouseY/pixels_in_a_meter);
    mouse_joint.maxForce = 10000;
    mouse_joint.timeStep = m_timeStep;
    mouseJoint = m_world.CreateJoint(mouse_joint) as b2MouseJoint;
   }
  }
  public function on_mouse_up(evt:MouseEvent):void {
   if (mouseJoint) {
    m_world.DestroyJoint(mouseJoint);
    mouseJoint = null;
   }
  }
  public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body {
   real_x_mouse = (stage.mouseX)/pixels_in_a_meter;
   real_y_mouse = (stage.mouseY)/pixels_in_a_meter;
   mousePVec.Set(real_x_mouse, real_y_mouse);
   var aabb:b2AABB = new b2AABB();
   aabb.lowerBound.Set(real_x_mouse - 0.001, real_y_mouse - 0.001);
   aabb.upperBound.Set(real_x_mouse + 0.001, real_y_mouse + 0.001);
   var k_maxCount:int = 10;
   var shapes:Array = new Array();
   var count:int = m_world.Query(aabb, shapes, k_maxCount);
   var body:b2Body = null;
   for (var i:int = 0; i < count; ++i) {
    if (shapes[i].m_body.IsStatic() == false || includeStatic) {
     var tShape:b2Shape = shapes[i] as b2Shape;
     var inside:Boolean = tShape.TestPoint(tShape.m_body.GetXForm(), mousePVec);
     if (inside) {
      body = tShape.m_body;
      break;
     }
    }
   }
   return body;
  }
 }
}














