当前位置:嗨网首页>书籍在线阅读

39-创建箱子

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.7.1 创建箱子

该例所要创建的世界在本质上和上一个示例是一样的,y轴的重力系数是10,scaleFactor是30。

var world = new b2World(new b2Vec2(0,10), true);
var scaleFactor = 30;

在这个世界中创建一组25×25的箱子,这些箱子会在位于距画布右侧100像素的地方一个叠一个堆起来,然后在程序开始时从距底部100像素的位置开始向地面跌落。

var numBoxes = 8;
var boxes = new Array();
var boxHeight = 25;
var boxWidth = 25;
var startX = (theCanvas.width-100);
var startY = (theCanvas.height-boxHeight)-100

当在循环中创建箱子时,所做的操作与创建墙体时的操作在本质上是一样的。依然使用scaleFactor进行到MTS单位的转换,但是这次不使用b2_staticBody,而是将箱子定义为b2_dynamicBody。这意味着箱子可以运动,并受到Box2D中物理定律的影响。

这里需要做的另一件事是将每一个箱子向右平移(i*2)个像素。这么做的目的是使上层的箱子落在下面箱子的右面一点点。这样摆放就会使得箱子处于不稳定的状态,当落在地面上的时候箱子就会滚落。这样,就可以在画布上演示箱子旋转的效果了。

for (var i=0; i < numBoxes; i++) {
  var boxDef = new b2BodyDef;
  boxDef.type = b2Body.b2_dynamicBody;
  var ypos = (startY-(i*boxHeight))/scaleFactor;
  var xpos = (startX+(i*2))/scaleFactor;
  boxDef.position.Set(xpos, ypos);
   var newBox = world.CreateBody(boxDef)
  var boxFixture = new b2FixtureDef;
  boxFixture.density = 10.0;
  boxFixture.friction = 0.5;
  boxFixture.restitution = 1;
   boxFixture.shape = new b2PolygonShape;
  boxFixture.shape.SetAsBox((boxWidth/scaleFactor)/2, (boxHeight/scaleFactor)/2);
  newBox.CreateFixture(boxFixture);

还要对箱子应用b2Body的SetUserData()方法,这是之前创建墙体时不曾做过的事情。这个方法允许创建一个动态物体的时候保存所需要的任何类型的数据,数据将会附加在物体上。此处的目的是在物体上附加一个保存箱子宽度和高度的对象(MTS单位),这样,在drawScreen()函数中就可以很容易地将这个箱子绘制在画布上了。

  newBox.SetUserData({width:boxWidth/scaleFactor, height:boxHeight/scaleFactor})
  boxes.push(newBox);
}