Actionscript 3 太空飞行闪光中的虫子

Actionscript 3 太空飞行闪光中的虫子,actionscript-3,flash,Actionscript 3,Flash,我是flash新手,在代码中找不到bug。我希望太空船能够在矢量中加速,不能在最大速度上加速,在停止加速时保持该速度矢量,但随后会受到摩擦(太空尘埃)。(它发生在2d阶段。) 我认为我的数学是正确的,但我发现velVector有时返回NaN,这是我的代码: var friction:Number = .96; var force:Number = .1; var maxVel:Number = 3; var accVector:Object = new Object(); var velVect

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

我认为我的数学是正确的,但我发现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;
}

非常感谢

我猜,您的问题在于使用不安全的数学运算而没有值验证。所以,你们的向量依赖于加速度向量。有一个除法运算,计算“加速度”值。就是这样:

acceleration = (maxVel - velocity)/maxVel*force;
在AS3中,你可以除以零,在这种情况下你会得到无穷大。但是,如果将0除以0,也有机会得到NaN:

var acceleration:Number = 0 / 0;
trace(acceleration); //NaN
如果您尝试使用NaN将结果写入数字或非类型化变量(不是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.

我希望,这会有所帮助。

angle
变量的类型是number,但您给了它一个小写的“n”。你的实际代码有相同的错误吗?没有。很抱歉,我不知道您可以使用^2(我自己也试过)。然而,它似乎不符合您的要求,因为“5^2”等于7,而不是25?您可以使用
Math.pow(velVector.vx,2)我认为您应该执行扩展日志记录,以便捕获在某处抛出NaN的向量。在enterframelistener中放入一个trace语句,并在任何以任何方式更改
velVector
的地方放入一个trace('theFunction called')。为了避免垃圾邮件,放置一个enterframe跟踪,如
if(!nanflag)if(isNaN(velVector.vx)){nanflag=true;跟踪('velVector.vx is NaN');}
确实有用。谢谢我进行了调整,使其永远不能被零除,并将^2替换为x*x。它现在或多或少地按照预期工作;)