疑问:什么时候怎么转换单位?
回答:
游戏引擎内部的各种数据其单位都是真实单位,如位置坐标、长宽等以米作单位,而flash绘制动画使用的是像素,所以我觉得这里对于刚刚学习box2d来说,很容易产生迷惑、出问题。
是这样的:凡是设置给引擎变量的数据,你都要意识到它们的单位是实际单位,如bodyDef.position.set(x, y)、new circleShape(radius)以及polygonShape.setAsBox(width, height)这些地方,各个参数单位都是米,你设定的值要尽量接近现实;而像{addChild(sp);sp.x = xx;sp,y = xx;sp.width = xx;sp.height = xx;}这样的地方,都是像素级别的数据,同样你给的值要让这个sp对象在舞台范围能完好显示出来。使用同一个缩放比例对以上两种类型的数据先乘(或除),然后再赋值。
举个例子:
private var pxToM:Number = 30;
createWheel(0.5, 400, 300, 100, 0);
private function createWheel(radius:Number, startX:Number, startY:Number, xVelocity:Number, yVelocity;Number):void
{
var wheelBodyDef:b2BodyDef = new b2BodyDef();
wheelBodyDef.position.Set(startX / pxToM, startY / pxTom);//这一句是游戏引擎内部需要接收的,舞台上的400px * 300px传入Set需要转换
var userSp:Sprite = new Sprite();
wheelBodyDef.userData = userSp;
addChild(wheelBodyDef.userData)
with (wheelBodyDef.userData)
{
x = startX;
y = startY;
width = radius * 2 * pxToM;
height = radius * 2 * pxToM;//以上四句是fp绘制图形所依据的,radius == 0.5,如果不乘缩放比例,在舞台上根本就看不见,所以要乘pxToM
}
var wheelBody:b2Body = world.createBody(wheelBodyDef);
.......
}
PS:重在理解,说了很多废话,其实就是看这个参数值是否符合真实情况