Action Script 3 (Flash) Timer - я не могу правильно установить таймер - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть функция во Flash (Action Script 3) - она ​​заставляет снежинки падать.Теперь я хочу, чтобы снежинки появлялись на экране только на 3 секунды.Поэтому я пытаюсь использовать класс Timer, но у меня проблема:

var myTimer:Timer = new Timer(3000, 1); 
myTimer.addEventListener(TimerEvent.TIMER, snowflakes);
myTimer.start();

function snowflakes(event:TimerEvent):void {
 //snowflakes faling function
}

В этом случае снежинки появляются через 3 секунды и остаются на сцене навсегда ... Так что это как бы наоборотчто я хотелЯ хочу, чтобы они появлялись с самого начала, а затем исчезали через 3 секунды.Как я могу это сделать?

... РЕДАКТИРОВАТЬ

О, да.Я извиняюсь за это.Вот кодЯ получил класс snowFlakes в отдельном файле Snowflake.as, который содержит этот код:

package 
{
    import flash.display.*;
    import flash.events.*;

    public class Snowflake extends MovieClip
    {
        private var xPos:Number = 0;
        private var yPos:Number = 0;

        private var xSpeed:Number = 0;
        private var ySpeed:Number = 0;

        private var radius:Number = 0;

        private var scale:Number = 0;
        private var alphaValue:Number = 0;

        private var maxHeight:Number = 0;
        private var maxWidth:Number = 0;

        public function Snowflake()
        {
            //SetInitialProperties();
        }

        public function SetInitialProperties()
        {
            //Setting the various parameters that need tweaking 
            xSpeed = .05 + Math.random()*.1;
            ySpeed = .1 + Math.random()*6;
            radius = .1 + Math.random()*2;
            scale = .01 + Math.random();
            alphaValue = .1 + Math.random();

            var stageObject:Stage = this.stage as Stage;
            maxWidth = stageObject.stageWidth;
            maxHeight = stageObject.stageHeight;

            this.x = Math.random()*maxWidth;
            this.y = Math.random()*maxHeight;

            xPos = this.x;
            yPos = this.y;

            this.scaleX = this.scaleY = scale;
            this.alpha = alphaValue;

            this.addEventListener(Event.ENTER_FRAME, MoveSnowFlake);
        }

        function MoveSnowFlake(e:Event)
        {
            xPos += xSpeed;
            yPos += ySpeed;

            this.x += radius*Math.cos(xPos);
            this.y += ySpeed;

            if (this.y - this.height > maxHeight)
            {
                this.y = -10 - this.height;
                this.x = Math.random()*maxWidth;
            }
        }
    }
} 

, и первый кадр на временной шкале на слое AS содержит этот код:

import flash.utils.Timer;
import flash.events.TimerEvent;

var myTimer:Timer = new Timer(3000, 1);
myTimer.addEventListener(TimerEvent.TIMER, runOnce);
myTimer.start();

function runOnce(event:TimerEvent):void {
 for (var i:int = 0; i < 50; i++)
    {
        var newSnowFlake:Snowflake = new Snowflake();
        this.addChild(newSnowFlake);

        newSnowFlake.SetInitialProperties();
    }
}

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Ваш таймер настроен просто отлично, проблема в том, что вы делаете с ним.
Вызовите snowFlakes с самого начала и привяжите событие таймера к removeSnowFlakes, где вы удалите Child все снежинкиВы добавили функцию снежинок.

РЕДАКТИРОВАТЬ:

Применить следующие изменения в свой код:

import flash.utils.Timer;
import flash.events.TimerEvent;

var snowFlakeContainer : MovieClip;
var myTimer:Timer = new Timer(3000, 1);
myTimer.addEventListener(TimerEvent.TIMER, removeSnowFlakes);
myTimer.start();

addSnowFlakes();

function addSnowFlakes():void {
    snowFlakeContainer = new MovieClip();
    for (var i:int = 0; i < 50; i++)
    {
        var newSnowFlake:Snowflake = new Snowflake();
        snowFlakeContainer.addChild(newSnowFlake);

        newSnowFlake.SetInitialProperties();
    }
}

function removeSnowFlakes(event:TimerEvent):void {
    removeChild(snowFlakeContainer);
    snowFlakeContainer = null;
}
0 голосов
/ 25 ноября 2011

На этот вопрос уже был принят ответ, прежде чем я смог опубликовать свой ответ, но я все равно отвечу.

Вы можете добавить внутренний объект Timer к вашему объекту SnowFlake, который после завершения удаляет SnowFlake из контейнера родительского экранного объекта. Вот пример:

package 
{
    import flash.display.Sprite;
    import flash.display.TriangleCulling;
    import flash.events.Event;
    import flash.utils.Timer;

    public class Main extends Sprite 
    {
        private var _spawnTime:int = 5;
        private var _spawnTimeCounter:int;

        private var _triangles:Vector.<Triangle>;
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            _triangles = new Vector.<Triangle>();
            addEventListener(Event.ENTER_FRAME, onEnterFrame);

        }
        private function onEnterFrame(e:Event):void
        {
            if (_spawnTimeCounter > _spawnTime)
            {
                var triangle:Triangle = new Triangle(random(1, 5), 3000)
                triangle.x = random(0, stage.stageWidth);
                addChild(triangle);
                triangle.drop();

                _spawnTimeCounter = 0;
            }

            _spawnTimeCounter++;
        }

        private function random(min:Number, max:Number):Number
        {
            return Math.floor((Math.random() * ((1 + max) - min)) + min);

        }
    }

}

import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;

internal class Triangle extends Sprite
{
    public var speed:Number;

    private var _delay:Number;
    private var _timer:Timer;

    public function Triangle(speed:Number = 1, delay:Number = 0) 
    { 
        this.speed = speed;
        _delay = delay;

        init(); 

    }// end function

    public function init():void
    {
        graphics.beginFill(0xFFFFFF);
        graphics.lineStyle(2, 0x000000);
        graphics.drawTriangles(Vector.<Number>([0, 20, 15, 0, 30, 20]));
        graphics.endFill();

    }// end function

    public function drop():void
    {
        if (parent && !hasEventListener(Event.ENTER_FRAME))
        {
            addEventListener(Event.ENTER_FRAME, onEnterFrame);

            if (_delay > 0)
            {
                _timer = new Timer(_delay, 1);
                _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
                _timer.start();

            }// end if

        }// end if

    }// end function

    public function remove():void
    {
        if (parent) parent.removeChild(this);

    }// end function

    private function onEnterFrame(e:Event):void
    {
        y += speed;

    }// end function

    private function onTimerComplete(e:TimerEvent):void
    {
        removeEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
        removeEventListener(Event.ENTER_FRAME, onEnterFrame);

        remove();

    }// end function

}// end class

Если запустить код, вы можете увидеть непрерывно падающие снежные хлопья (треугольники), падающие с различной скоростью, но каждая снежная хлопья исчезает через 3 секунды.

enter image description here

...