box2d的渲染问题

box2d 里对象的渲染 一般的做法 就是用bodyDef.userData属性来进行渲染!

bodyDef.userData=某个你画出来的图片(Sprite类型,比如说是我们在flash画的MC人物对象)

 

在box2d的hellowWorld里也里也进行了渲染  :

@1  : 一个是使用了bodyDef.userData 

@2 :在Update函数对该userData的位置进行更新

 

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;
          bb.m_userData.y = bb.GetPosition().y;
          bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
     }
}

 

 

所以box2d里对象的渲染问题主要靠上面两个位置实现

 

 

  因此我们可以加一些比较有特设的东西进去

比如在 update函数里

      用自定义的颜色画出关节Joint

 

 

下面是一个DistantJoint的渲染  <由于空间不稳定,故没有demo :直接复制代码就可以了>

 

用法:  点击地板(即密度为0的body)  可以看见地板和圆对象之间形成了b2DistantJoint ,松开鼠标,销毁Joint:

 

 

 

codes:

 

 

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 distance_joint extends Sprite {
  private var mouseJoint:b2MouseJoint;
  private var mousePVec:b2Vec2 = new b2Vec2();
  private var bd:b2BodyDef;
  private var the_circle:b2CircleDef = new b2CircleDef();
  var circle:b2Body;
  private var the_box:b2PolygonDef = new b2PolygonDef();
  private var the_joint:b2DistanceJointDef = new b2DistanceJointDef();
  private var joint:b2DistanceJoint;
  //
  public var m_world:b2World;
  public var m_iterations:int=10;
  public var m_timeStep:Number=1.0/30.0;
  //
  var my_canvas:Sprite = new Sprite();
  public function distance_joint() {
   addChild(my_canvas);
   // 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);
   // ground
   the_box.SetAsBox(9,0.5);
   the_box.density=0;
   the_box.friction=0.4;
   the_box.restitution=0.1;
   bd = new b2BodyDef();
   bd.position.Set(8.5, 13);
   var ground:b2Body=m_world.CreateBody(bd);
   ground.CreateShape(the_box);
   ground.SetMassFromShapes();
   // roof
   the_box.SetAsBox(9,0.5);
   the_box.density=0;
   the_box.friction=0.4;
   the_box.restitution=0.1;
   bd = new b2BodyDef();
   bd.position.Set(8.5, 0);
   var roof:b2Body=m_world.CreateBody(bd);
   roof.CreateShape(the_box);
   roof.SetMassFromShapes();
   // circle
   the_circle.radius=2;
   the_circle.density=1.0;
   the_circle.friction=0.4;
   the_circle.restitution=0.3;
   bd = new b2BodyDef();
   bd.position.Set(6, 2);
   circle=m_world.CreateBody(bd);
   circle.CreateShape(the_circle);
   circle.SetMassFromShapes();
   // 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(true);
   if (body) {
    the_joint.Initialize(circle, body, circle.GetWorldCenter(),new b2Vec2(mouseX/30,mouseY/30));// 先draw前面的点,在draw后面的点,最后两点相连形成distantjoint
    the_joint.collideConnected=true;
    joint=m_world.CreateJoint(the_joint) as b2DistanceJoint;
   }
  }
  public function destroyMouse(evt:MouseEvent):void {
   if (joint) {
    m_world.DestroyJoint(joint);
    joint=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()) {
     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);
   my_canvas.graphics.clear();
   my_canvas.graphics.lineStyle(4,0x000000,1);
   //开始渲染:***********************************
   for (var j:b2Joint=m_world.GetJointList(); j; j=j.GetNext()) {
    my_canvas.graphics.moveTo(j.GetAnchor1().x*30,j.GetAnchor1().y*30);
    my_canvas.graphics.lineTo(j.GetAnchor2().x*30,j.GetAnchor2().y*30);
   }
  }
 }
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值