太空运动中的错误FLASH

时间:2013-04-02 21:44:07

标签: actionscript-3 flash

我是flash的新手,无法在我的代码中找到错误。我希望太空飞船能够在矢量中加速,不能加速超过最大速度,以便在它停止加速时保持速度矢量但是然后遭受摩擦(太空尘埃))。 (它发生在第二阶段。)

我认为我的数学是正确的,但我得到了一个错误的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;

如果船指向正确的方向,则执行“加速”功能,否则执行功能“漂移”。它总是执行'移动'

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;
}

非常感谢!

1 个答案:

答案 0 :(得分:0)

我想,你的问题是在没有值验证的情况下使用不安全的数学运算。所以,你的velVector依赖于accVector,它取决于加速度。你有一个计算“加速度”val的除法运算。就是这样:

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

在AS3中你可以除以零,在这种情况下你会获得无限。但是,如果你将零除零,也有机会获得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.

我希望,这会有所帮助。