在空间移动FLASH Bug



我是flash新手,在我的代码中找不到bug。我希望飞船能够在矢量上加速,不能在最大速度上加速,当它停止加速时保持这个速度矢量,但会受到摩擦(太空尘埃)。(它发生在2d阶段)

我认为我的数学是正确的,但我得到一个bug与velVector 有时返回NaN -这是我的代码:

var friction:Number = .96;
var force:Number = .1;
var maxVel:Number = 3;
var accVector:Object = new Object();
var velVector:Object = new Object();
var velocity:Number;
var acceleration:Number;

如果船指向正确的方向,它执行函数'加速',如果不是,它执行函数'漂移'。它总是执行'moveship'

function accelerate():void {
    curRotation.vx = Math.cos(rotation/180*Math.PI);
    curRotation.vy = Math.sin(rotation/180*Math.PI);
    var angle:Number = Math.atan2(curRotation.vy, curRotation.vx);
    velocity = Math.sqrt(velVector.vx^2 + velVector.vy^2); //get velocity in both directions
    acceleration = (maxVel - velocity)/maxVel*force; //this is to make it harder to accelerate when it approaches maxvelocity
    accVector.vx = Math.cos(angle) * acceleration; //accelerate in each dimension
    accVector.vy = Math.sin(angle) * acceleration;
    velVector.vx += accVector.vx; //add acceleration to velocity
    velVector.vy += accVector.vy;
}
function drift():void {
    velVector.vx *= friction; //decrease velocity when not accelerating
    velVector.vy *= friction;       
}
function moveShip():void {
    trace("velocity", velocity)
    x += velVector.vx; //move
    y += velVector.vy;
}

多谢!

我猜,你的问题是在使用不安全的数学运算没有值验证。你的velVector依赖于accVector后者依赖于加速度。你有一个除法运算,计算"加速度"值,就是这样:

acceleration = (maxVel - velocity)/maxVel*force;

在AS3中你可以除以零,在这种情况下你会得到无穷大。但是,如果你用0除以0,也有可能得到NaN:

var acceleration:Number = 0 / 0;
trace(acceleration); //NaN

如果你尝试用NaN做一些事情,把结果写成Number或无类型变量(不是int!),你总是会得到NaN:

var a:Number = 5 * NaN;
trace(a); //NaN

这里有一个例子,它给出了NaN:

acceleration = 0 / 0; //NaN
accVector.vx = Math.cos(angle) * acceleration; //NaN regardless on "angel" value
velVector.vx += accVector.vx; //NaN regardless on "velVector" value.

最新更新