0

所以我刚刚开始尝试从 AS2 合并到 AS3,但事情已经不像逻辑上应该的那样了。我正在尝试制作一个简单的基于时间的粒子系统,只需一个发光的球影片剪辑就可以制作出烟花效果。有一个 Main 类和一个名为 Ball 的发光球类。问题是当我将生成圆圈的 Main 类中的 addEventListener 更改为: stage.addEventListener(MouseEvent.CLICK...) 由于某种原因,圆圈并非都从同一点(在中心)开始,并且我等待点击的时间越长,它们产生的距离就越远......我到底做错了什么?

主类:

package  {

    import flash.display.MovieClip;
    import flash.events.*;


    public class Main extends MovieClip {

        public function Main() {
            addEventListener(Event.ADDED_TO_STAGE, downed);
        }

        private function downed(event:Event){
                for(var i:int = 0; i < 50; i++){
                    var a:Ball = new Ball(275, 200, randomSpeed(), randomSpeed());
                    addChild(a);
                }
        }

        private function randomSpeed():int{
            var speed:int = Math.random()*150;
            if(Math.random() > .5){
                speed *= -1;
            }
            return speed;
        }
    }
}

球类:

package  {

    import flash.display.*;
    import flash.events.*;
    import flash.utils.getTimer;

    public class Ball extends MovieClip {
        private var speedX, speedY:Number;
        private var lastTime:int;
        private var gravity:int = 3.5;

        public function Ball(x:int, y:int, dx:int, dy:int):void {
            this.x = x;
            this.y = y;
            speedX = dx;
            speedY = dy;
            lastTime -= getTimer();
            this.addEventListener(Event.ENTER_FRAME, moveBall);
        }

        private function moveBall(event:Event){
            var timePassed:int = getTimer()-lastTime;
            lastTime += timePassed;

            this.x += (speedX*timePassed)/1000;
            this.y += (speedY*timePassed)/1000;
            speedY += gravity;
        }
    }
}
4

1 回答 1

0

在您的 moveBall() 方法中,您正在使用getTimer()

Adobe 说:对于处理 ActionScript 3.0 的 Flash 运行时,此方法返回自用于 ActionScript 3.0 (AVM2) 的 Flash 运行时虚拟机启动以来经过的毫秒数。

这意味着从 getTimer() 返回的值将在您等待单击时继续增长。

这就是为什么您会体验到球的初始化距离更远 - 每个球的速度值会随着您等待点击的时间越长而增加,从而将每个球立即移动到速度值对应的第一个位置,这将是一个更远的距离你等待的时间更长。当您使用添加到舞台事件时不会发生这种情况,因为在 Flash 文件开始运行时会立即添加球,并且 getTimer() 的值是 0 或太小而无法注意到。

你的意图是什么?在球移动时加快球的速度还是减慢球的速度?如果是后者,您将在每次循环运行时从球速度中减去摩擦值。

public function moveBall(event:Event)
{
    var friction:Number = .7;
    speedX *= friction;
    speedY *= friction;

    this.x += speedX;
    this.y += speedY;
}

此外,还有一些提示:最好将所有粒子放入一个数组中,这样您就可以访问所有粒子以从舞台上移除、碰撞检测等。在 Main 类中包含一个更新循环也是一个更好的主意它遍历该粒子数组并在每个粒子中调用更新方法,而不是每个粒子都有自己的 enterFrame 事件。这样,您可以执行诸如停止所有粒子之类的操作,例如,当您想要暂停游戏时,或者能够清理事件侦听器以进行内存管理。

于 2013-08-16T01:37:28.147 回答