ActionScript: как сбросить значение интервала каждый раз, когда работает функция? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть функция, которая рисует прямоугольник на экране (см. CreateInfoPanel ())
Рисуя прямоугольник, я добавляю на него 2 текстовых поля.
Но, как вы можете догадаться, он добавляет их немедленно.
Я хочу отложить добавление этих текстовых полей, а затем через некоторое время удалить эти панели.
Проблема в том, что когда я устанавливаю интервал или таймер, они не будут работать после того, как я использую один раз (мне пришлось остановить их, очистив / удалив, он не установил их снова).
Поскольку моя панель создается при каждом изменении изображения, мне нужно, чтобы они работали при каждом изменении изображения.

Итак, у меня есть 2 вопроса:
1- Как я могу переустанавливать интервал каждый раз, когда работает моя функция createInfoPanel ()? Это не будет работать после установки и очистки один раз.

2 - Вы можете увидеть infoPanel.addChild (titleField); строка в функции addInfoPanel (). Как я могу работать плавную анимацию здесь? Я имею в виду, текст появляется медленно?

Заранее спасибо.

public class ImageRotator extends Sprite
{
private var ... ; //Some variables

public function ImageRotator(xmlPath:String = "images.xml", interval:int = 8301):void
{
    timer = new Timer(interval);
    loadXML(xmlPath);
}

private function loadXML(file:String):void
{
    urlLoader = new URLLoader(new URLRequest(file));
    urlLoader.addEventListener(Event.COMPLETE, parseXML);
}

private function parseXML(e:Event):void
{
    xml = new XML(e.target.data);
    loadImages();
}

private function loadImages():void
{
    for (var i:int = 0; i < xml.children().length(); i++)
    {
        var loader:Loader = new Loader();
        loader.load(new URLRequest(xml.children()[i].@src));
        imagesVector.push(loader);
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, sortImages);
    }
}

private function sortImages(e:Event):void
{
    imagesCounter++;

    for (var i:int = 0; i < imagesVector.length; i++)
    {
        imagesVector.reverse();
        addChild(imagesVector[i]);
    }

    //I have only 3 images, I needed to set indexes because
    //they were covering each other
    this.setChildIndex(imagesVector[2], 0);
    this.setChildIndex(imagesVector[1], 0);
    this.setChildIndex(imagesVector[0], 0);

    if (imagesCounter == imagesVector.length)
    {
        createInfoPanel();
        timer.addEventListener(TimerEvent.TIMER, autoChange);
        timer.start();
    }

}

private function createInfoPanel():void
{
    infoPanel.graphics.beginFill(0x000000, 0.0);
    infoPanel.graphics.drawRect(0, 0, 967, 138);
    infoPanel.graphics.endFill();

////Here I want to run addInfoPanel() function with 2 seconds delay,
////After it starts, I want to run removeInfoPanel() function with 2 more seconds delay

    addChild(infoPanel);

}

private function addInfoPanel():void {
    titleField.text = xml.children()[infoCounter]. @ title;
    titleField.x = 425;
    titleField.y = 0;

    description.text = xml.children()[infoCounter]. @ description;
    description.x = 427;
    description.y = 26;

    infoPanel.y = 300;
    infoPanel.addChild(titleField);
    infoPanel.addChild(description);
}

private function removeInfoPanel():void {

    infoPanel.removeChild(titleField);
    infoPanel.removeChild(description);
}

private function addActions():void
{
    //Some function
}

private function changeImage(e:MouseEvent):void
{
    //Image changing function
}

private function changeDepth(e:TweenEvent):void
{
    //Some function
}

private function autoChange(e:TimerEvent):void
{
    //Some function
}
}

Редактировать: Как я привык работать с интервалами:

private function createInfoPanel():void
{
    //lines above code sample
    intervalInfoPanel = setInterval(addInfoPanel,2000);

    addChild(infoPanel);
}

private function addInfoPanel():void {
    //lines above code sample
    clearInterval(intervalInfoPanel);
    intervalInfoPanelRemove = setInterval(removeInfoPanel,3500);
}

private function removeInfoPanel():void {
    //lines above code sample
    clearInterval(intervalInfoPanelRemove);
}

1 Ответ

1 голос
/ 19 марта 2012

1 - Как я могу переустанавливать интервал каждый раз, когда моя функция createInfoPanel () работает? Он больше не будет работать после однократной настройки и очистки.

как именно вы сбрасываете интервал? Вы не показываете код здесь.
но обычно вы можете сбросить + повторно использовать таймер следующим образом:

timer.reset();

это остановит и сбросит таймер currentCount на 0.
позже вы можете сказать timer.start(); и все должно работать так, как никогда раньше.

2 - Вы можете увидеть infoPanel.addChild (titleField); строка в addInfoPanel () функция. Как я могу работать плавную анимацию здесь? Я имею в виду, текст появляется медленно?

используйте анимацию. добавьте TextFields с txt.alpha = 0;, а затем медленно измените альфа-значение до 1,0. TweenLite (http://www.greensock.com/tweenlite/) - отличный твиннинг-движок.

import com.greensock.*;

txt.alpha = 0.0;
TweenLite.to(txt, 1, {alpha:1.0, delay:0.4});
...