int 工作正常,但会导致一些不稳定的运动......数字导致 AS3 中的奇怪行为

int works fine, but causes some jerky motion... Number causes strange behavior in AS3

注意,我对这整件事还很陌生,所以如果我使用了一些不正确的措辞,我深表歉意。

创建 类 时 Number 数据类型会导致问题吗?我有一个名为 Asteroidclass,当它被实例化时,我声明了一些我在 运行 时为其赋值的属性,例如 .zVelocity.xVelocity.yVelocity 例如。当它们被声明为 int 数据类型时,一切都可以编译并且 运行 很好,但是当通过我的三角函数更改属性时,我 运行 会出现一些不稳定的运动。所以我将它们全部更改为 Number 数据类型,突然发生了一些非常奇怪的事情...... Asteroid 实例不再加载到它们正确的 .x.y 坐标时 .swf 是 运行。相反,所有加载到左上角 stage 对象的原点。如果我将 .xVelocity 数据类型改回 int,那么所有 Sprite 对象都会沿着 stage 的顶部水平呈现。我希望这是有道理的。我可以上传文件,但我需要一些指导。

package {

import flash.display.Sprite;

public class Asteroid extends Sprite {

    var xVelocity: Number;
    var yVelocity: int;
    //var zVelocity: Number;
    var velocity: Number;
    var factor: uint;

    public function Asteroid(): void {

        //xVelocity = Math.floor(Math.random()*6)-3;
        //yVelocity = Math.floor(Math.random()*4)-2;
        //zVelocity = Math.floor(Math.random()*4);
    }
}
}

和我的文档 Class:

        //////
        //    TIMER
        //////
        timer.start();
        timer.addEventListener(TimerEvent.TIMER, timerFunction);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerComplete);

        function timerFunction(e: TimerEvent): void {
            //trace("length: " + asteroids.length);
            if (asteroids.length < 1000) {
                newAsteroid();
            }


            for (var i: int = 0; i <= asteroids.length - 1; i++) {

                asteroids[i].alpha -= .05;
                asteroids[i].x += asteroids[i].xVelocity;
                asteroids[i].y += asteroids[i].yVelocity;
                //asteroids[i].z += asteroids[i].zVelocity;
                //asteroids[i].zVelocity += .1 ;
                //asteroids[i].xVelocity /= 1.1;
                //asteroids[i].yVelocity /= 1.1;

                if (asteroids[i].alpha <= .05) {
                    asteroids.splice(i, 1);
                    removeChild(asteroids[i]);
                    i--;
                }

            }

        }

        function timerComplete(e: TimerEvent): void {
            trace("stop");
        }


        //////
        //    Asteroids
        //////
        function newAsteroid(): void {

            for (var i: int = 0; i <= 100; i++) {

                var idx: int = Math.floor(Math.random() * colorArray.length);

                asteroid = new Asteroid();
                asteroid.x = (Math.random() * stage.stageWidth * .5 + stage.stageWidth * .25) as Number;
                asteroid.y = (Math.random() * (stage.stageHeight - 100) + 50) as Number;
                asteroid.graphics.lineStyle();
                asteroid.graphics.beginFill(colorArray[idx], .6);
                asteroid.graphics.drawRect(0, 0, 5, 5);
                addChild(asteroid);
                asteroids.push(asteroid);
            }
        }

    }
}

}

我可能遗漏了一些非常简单的东西。哦,请随时就我养成的任何糟糕习惯提出建议,但要完全纠正我的代码可能超出了这个问题的范围,尽管任何尝试都会受到热烈欢迎。

**编辑

通过实施下面标记为正确的答案解决了抖动问题!

int 类型的默认值为 0,这就是它们适用于您的情况的原因,但缺点是它们会将所有值四舍五入为整数,这会在动画中产生奇怪的效果。

数字类型的默认值为 NaN(不是数字),这就是您遇到很多麻烦的原因。

你永远不会给你的变量一个默认值(你永远不会实例化它们),在 int 的情况下可以工作,因为它们从零开始但是在 Number 的情况下不起作用,因为它们以 NaN 作为默认值开始价值。你一直在尝试使用它们,但它们一直只有 return NaN,而且没有任何效果。

我猜你现在知道该怎么做了,但以防万一:

在使用它们之前给你的变量一个值!