0

我是 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;

如果船指向正确的方向,则执行“加速”功能,否则执行“漂移”功能。它总是执行'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;
}

非常感谢!

4

1 回答 1

0

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

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

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

我希望这个能帮上忙。

于 2013-04-03T06:05:40.060 回答