我是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;
}
非常感谢!
答案 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.
我希望,这会有所帮助。