(2011-05-12 旧博文搬家)BOX2D_坦克大战

初学BOX2D,做了一个简单小游戏 像以前玩的疯狂坦克 键盘控制 改变力度和角度射击 吧所有砖头炸出灰色区域就赢了


BOX2D的2.1版加入了爆炸效果,但是2.02版没有,所以我用的方法是以爆炸点为中心建立一个AABB区域,获得处于这个区域内的缸体,

根据中心点到这些缸体的向量决定赋予其i受力的大小和方向。

 

function BombAtArea(areaCenter:b2Vec2):void {

    var aabb:b2AABB=new b2AABB  ;
    aabb.lowerBound.Set(areaCenter.x-5,areaCenter.y-5);
    aabb.upperBound.Set(areaCenter.x+5,areaCenter.y+5);   //建立一个以爆炸点为中心的区域
    var k_maxCount:int=16;   

    var shapes:Array=new Array  ;//用来保存检测到的刚体的数组
    var count:int=myWorld.Query(aabb,shapes,k_maxCount);
    var body:b2Body=null;
    var powerInX:Number;
    var powerInY:Number;
    var line:Number;
    for (var i:int=0; i<count; ++i) {        // 遍历刚体
        if (shapes[i].GetBody().IsStatic()==false&&shapes[i].GetBody()!=cannonBomb) {  //该刚体不能是静态的或者炮弹本身
      var tShape:b2Shape=shapes[i] as b2Shape;
      body=tShape.GetBody();


      line=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).x*cannonBomb.GetLocalPoint(body.GetWorldCenter()).x+cannonBomb.GetLocalPoint(body.GetWorldCenter()).y*cannonBomb.GetLocalPoint(body.GetWorldCenter()).y);
      line=Math.sqrt(line);

//用勾股定理求出从中心到刚体中心的距离
      powerInX=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).x)*(7.5-line)/line;   //设置X Y方向的施力,最大值7.5牛
      powerInY=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).y)*(7.5-line)/line;
      body.ApplyForce(new b2Vec2(powerInX* 0.5,powerInY* 0.5 ),new b2Vec2(0,0));
      //trace(body);
     } //end if
    }//end for

   }//end function BombAtArea

 

但是我这个区域由于是b2AABB,一个矩形的区域,但是实际爆炸影响的范围应该是圆形,模拟效果可能会受到影响本来应该受力的刚体没

有检测到。不知道有什么好方法可以建立一个圆形或者接近圆形的正多边形区域?


你可能感兴趣的:((2011-05-12 旧博文搬家)BOX2D_坦克大战)