box2d系列之创建b2Revolutejoint

/*

一般的,转动点pivot都很小,并且将其设为不可见(即转动点对象一般是隐藏的),下面的代码我们设置了其转动点为圆;
它的转动点在圆心,并且将它设为了可见。在实际操作中我们一般设置其(转动点对象(此处为圆))为不可见, 这里只是
为了更好的展示它 。注意:转动点在圆心 。当然我们也可以将其设在其他地方。


其代码和b2DistanceJoint一样, 只是在原来的基础上加了几行代码:
//定义转动点对象

the_pivot.radius = 0.5;
the_pivot.density = 0;//此处必须设为0,否则其将掉下去 其作为转动点,必须将其固定
bd = new b2BodyDef();
bd.position.Set(8.5,6.5);
var rev_joint:b2Body = m_world.CreateBody(bd);
rev_joint.CreateShape(the_pivot)
rev_joint.SetMassFromShapes();

//创建revoluteJoint对象  非常简单
the_rev_joint= new b2RevoluteDef()
the_rev_joint.Initialize(rev_joint, rev_box, new b2Vec2(8.5,6.5));
var joint_added:b2RevoluteJoint = m_world.CreateJoint(the_rev_joint) as b2RevoluteJoint;

*/


package {
 import flash.display.Sprite;
 import flash.events.Event;
 import Box2D.Dynamics.*;
 import Box2D.Collision.*;
 import Box2D.Collision.Shapes.*;
 import Box2D.Common.Math.*;
 import Box2D.Dynamics.Joints.*;
 import flash.events.MouseEvent;
 public class revolute_joint extends Sprite {
  var mouseJoint:b2MouseJoint;
  var mousePVec:b2Vec2 = new b2Vec2();
  var bd:b2BodyDef;
  var the_box:b2PolygonDef = new b2PolygonDef();
  var the_pivot:b2CircleDef = new b2CircleDef();
  var the_rev_joint:b2RevoluteJointDef = new b2RevoluteJointDef();
  public function revolute_joint() {
   // world setup
   var worldAABB:b2AABB = new b2AABB();
   worldAABB.lowerBound.Set(-100.0, -100.0);
   worldAABB.upperBound.Set(100.0, 100.0);
   var gravity:b2Vec2=new b2Vec2(0.0,10.0);
   var doSleep:Boolean=true;
   m_world=new b2World(worldAABB,gravity,doSleep);
   // debug draw
   var m_sprite:Sprite;
   m_sprite = new Sprite();
   addChild(m_sprite);
   var dbgDraw:b2DebugDraw = new b2DebugDraw();
   var dbgSprite:Sprite = new Sprite();
   m_sprite.addChild(dbgSprite);
   dbgDraw.m_sprite=m_sprite;
   dbgDraw.m_drawScale=30;
   dbgDraw.m_alpha = 1;
   dbgDraw.m_fillAlpha=0.5;
   dbgDraw.m_lineThickness=1;
   dbgDraw.m_drawFlags=b2DebugDraw.e_shapeBit|b2DebugDraw.e_jointBit;
   m_world.SetDebugDraw(dbgDraw);
   // pivot for revolute joint
   the_pivot.radius = 0.5;
   the_pivot.density = 0;//此处必须设为0,否则其将掉下去 其作为转动点,必须将其固定
   bd = new b2BodyDef();
   bd.position.Set(8.5,6.5);
   var rev_joint:b2Body = m_world.CreateBody(bd);
   rev_joint.CreateShape(the_pivot)
   rev_joint.SetMassFromShapes();
   // box for the revolute joint
   the_box.SetAsBox(4,0.5);
   the_box.density = 0.01;
   the_box.friction = 1;
   the_box.restitution = 0.1;
   bd = new b2BodyDef();
   bd.position.Set(8.5,6.5);//Set(x,y)里的y值 和转动点的y值一样,可以使其绕该点转动 注意:其x值不能和转动的x值一样,否则其将不转动
   var rev_box:b2Body = m_world.CreateBody(bd);
   rev_box.CreateShape(the_box)
   rev_box.SetMassFromShapes();
   the_rev_joint.Initialize(rev_joint, rev_box, new b2Vec2(8.5,6.5));
   var joint_added:b2RevoluteJoint = m_world.CreateJoint(the_rev_joint) as b2RevoluteJoint;
   // listeners
   stage.addEventListener(MouseEvent.MOUSE_DOWN, createMouse);
   stage.addEventListener(MouseEvent.MOUSE_UP, destroyMouse);
   addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
  }
  public function createMouse(evt:MouseEvent):void {
   var body:b2Body=GetBodyAtMouse();
   if (body) {
    var mouseJointDef:b2MouseJointDef=new b2MouseJointDef;
    mouseJointDef.body1=m_world.GetGroundBody();
    mouseJointDef.body2=body;
    mouseJointDef.target.Set(mouseX/30, mouseY/30);
    mouseJointDef.maxForce=30000;
    mouseJointDef.timeStep=m_timeStep;
    mouseJoint=m_world.CreateJoint(mouseJointDef) as b2MouseJoint;
   }
  }
  public function destroyMouse(evt:MouseEvent):void {
   if (mouseJoint) {
    m_world.DestroyJoint(mouseJoint);
    mouseJoint=null;
   }
  }
  public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body {
   var mouseXWorldPhys = (mouseX)/30;
   var mouseYWorldPhys = (mouseY)/30;
   mousePVec.Set(mouseXWorldPhys, mouseYWorldPhys);
   var aabb:b2AABB = new b2AABB();
   aabb.lowerBound.Set(mouseXWorldPhys - 0.001, mouseYWorldPhys - 0.001);
   aabb.upperBound.Set(mouseXWorldPhys + 0.001, mouseYWorldPhys + 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].GetBody().IsStatic()==false||includeStatic) {
     var tShape:b2Shape=shapes[i] as b2Shape;
     var inside:Boolean=tShape.TestPoint(tShape.GetBody().GetXForm(),mousePVec);
     if (inside) {
      body=tShape.GetBody();
      break;
     }
    }
   }
   return body;
  }
  public function Update(e:Event):void {
   m_world.Step(m_timeStep, m_iterations);
   if (mouseJoint) {
    var mouseXWorldPhys=mouseX/30;
    var mouseYWorldPhys=mouseY/30;
    var p2:b2Vec2=new b2Vec2(mouseXWorldPhys,mouseYWorldPhys);
    mouseJoint.SetTarget(p2);
   }
  }
  public var m_world:b2World;
  public var m_iterations:int=10;
  public var m_timeStep:Number=1.0/30.0;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值