Таймеры не создают задержку - PullRequest
0 голосов
/ 25 июня 2019

Я создаю программу в Adobe Animate;Одной из функций является отправка сообщений OSC в программу освещения DMX для изменения освещения в комнате.

Стандартные изменения работают, как и ожидалось, но у меня проблемы с "затуханиями".Мне нужно отправить серию сообщений OSC подряд.

Теперь у меня есть Adobe Animate, который создает серию таймеров с помощью независимой функции.Мне кажется, что мне нужна функция задержки, но я знаю, что это невозможно в AS3.

function fadeFixtureData(fixture:int, rgbStart:Array, rgbEnd:Array, intervals:int):void
{
if (rgbStart.length != rgbEnd.length)
{
    return void;
}

var rgbCalculated:Array = new Array();

for (var i = 0; i <= intervals; i++)
{
    for (var j = 0; j < rgbStart.length; j++)
    {
        rgbCalculated[j] = ((((rgbEnd[j] - rgbStart[j])/intervals) * (i)) + rgbStart[j]);
    }

    delayedFunctionCall((i * 33), function(e:Event)         {sendFixtureData(fixture,rgbCalculated);});

    trace(i * 33);
    trace(rgbCalculated);

}


}

function delayedFunctionCall(delay:int, func:Function) {
var timer:Timer = new Timer(delay, 1);
timer.addEventListener(TimerEvent.TIMER, func);
timer.start();
}

Программа, кажется, отслеживает все правильно, но в результате все сообщения отправляются одновременно.Только последнее сообщение передается в программу освещения.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Я бы предложил два способа.Оба метода должны позволить вам прервать любое затухание новым.Так что на полпути затухания вы можете изменить свое решение и захотеть снова затухать (если это, например, основано на человеческом взаимодействии).

Чтобы достичь этого, в этих примерах вы просто запускаете fadeTo(yourValue)снова, при необходимости.

Подход EnterFrame :

public class Main extends Sprite
{
    private var targetValue:Number;
    private var currentValue:Number = 0;
    private var increment:Number;
    private static const MAX_VALUE:int = 255;
    private static const FADE_TIME:Number = 5; // Seconds for a full fade from 0% to 100%.

    public function Main()
    {
        increment = MAX_VALUE / (stage.frameRate * FADE_TIME);  // Dynamically calculate based on app framerate.
        addEventListener(Event.ENTER_FRAME, enterFrameHandler);

        // Initiate a fade.
        fadeTo(1);
    }

    /**
     * Initiates fade.
     * @param   percentage A value between 0 and 1.  0 being off, 1 being full on, 0.5 as an example, being 50% brightness.
     */
    private function fadeTo(percentage:Number):void
    {
        if (percentage > 1) percentage = 1;
        if (percentage < 0) percentage = 0;         

        targetValue = MAX_VALUE * percentage;

    }

    private function enterFrameHandler(e:Event):void
    {
        if (currentValue == targetValue) return; // No updates required.

        if (currentValue < targetValue)
        {
            currentValue+= increment;
            if (currentValue > targetValue) currentValue = targetValue;
        } else {
            currentValue-= increment;
            if (currentValue < targetValue) currentValue = targetValue;
        }

        doRGBThing(currentValue);
    }

    private function doRGBThing(currentValue:Number):void
    {
        trace(int(currentValue));  // Replace this with your OSC related code.
    }
}

Подход Tween (как в TweenLite GreenSock):

public class MainTween extends Sprite
{
    private var currentValueObj:Object = {currentValue: 0};
    private static const MAX_VALUE:int = 255;
    private static const FADE_TIME:Number = 5; // Seconds for a full fade from 0% to 100%.

    public function MainTween()
    {
        // Initiate a fade.
        fadeTo(1);
    }

    /**
     * Initiates fade.
     * @param   percentage A value between 0 and 1.  0 being off, 1 being full on, 0.5 as an example, being 50% brightness.
     */
    private function fadeTo(percentage:Number):void
    {
        if (percentage > 1) percentage = 1;
        if (percentage < 0) percentage = 0; 

        TweenLite.killTweensOf(currentValueObj);
        TweenLite.to(currentValueObj as Object, FADE_TIME, {currentValue: MAX_VALUE * percentage, onUpdate: doRGBThing});
    }

    private function doRGBThing():void
    {
        trace(currentValueObj.currentValue);
    }
}
0 голосов
/ 04 июля 2019

Вы можете использовать setTimeOut вместо.

var myTm = setTimeOut(delay, 1000); // in milliseconds

function delay(): void {
    // your delayed code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...