int 工作正常,但会导致一些不稳定的运动......数字导致 AS3 中的奇怪行为
int works fine, but causes some jerky motion... Number causes strange behavior in AS3
注意,我对这整件事还很陌生,所以如果我使用了一些不正确的措辞,我深表歉意。
创建 类 时 Number
数据类型会导致问题吗?我有一个名为 Asteroid
的 class
,当它被实例化时,我声明了一些我在 运行 时为其赋值的属性,例如 .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,而且没有任何效果。
我猜你现在知道该怎么做了,但以防万一:
在使用它们之前给你的变量一个值!
注意,我对这整件事还很陌生,所以如果我使用了一些不正确的措辞,我深表歉意。
创建 类 时 Number
数据类型会导致问题吗?我有一个名为 Asteroid
的 class
,当它被实例化时,我声明了一些我在 运行 时为其赋值的属性,例如 .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,而且没有任何效果。
我猜你现在知道该怎么做了,但以防万一:
在使用它们之前给你的变量一个值!