отправить изменение значения и начать анимацию - PullRequest
0 голосов
/ 08 июля 2019

Я стараюсь сделать простой багбук.Это подача из внешнего XML-файла.

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

var myTimer:Timer = new Timer(100);
myTimer.addEventListener(TimerEvent.TIMER, timerListener);
myTimer.start();

function timerListener (e:TimerEvent):void 
{
    var myXMLLoader:URLLoader = new URLLoader();
    myXMLLoader.load(new URLRequest("Xml.xml"));
    myXMLLoader.addEventListener(Event.COMPLETE, processXML);

    function processXML (e:Event):void
    {
        var myXML:XML = new XML(e.target.data);

        ShotClock.text = myXML.timestamp;
        GameClock.text = myXML.Clock;
        HS.HomeScore.text = myXML.HomeScore;
        AS.AwayScore.text = myXML.AwayScore;
        Period.text = myXML.Period;
        AwayTeam.text = myXML.AwayName;
        HomeTeam.text = myXML.HomeName;
    }

    if ( (myXML.HomeScore).CHANGE ) 
    { var myTween:Tween = new Tween(HS.HomeScore, "alpha", Strong.easeIn, 0, 1, 1, true); }

}

1 Ответ

2 голосов
/ 08 июля 2019

Вам необходимо изменить логику загрузки. Вместо того, чтобы запускать синхронизированные загрузки, которые в любом случае не будут точными 100 мс, могут задержаться, могут выйти из строя, могут поступить в порядке, отличном от того, что вы их выполнили, и т. Д., Вам нужен однопоточный асинхронный цикл, который просто выполняет следующее :

  1. Начало загрузки данных.
  2. (асинхронная пауза)
  3. Обработка загруженных данных.
  4. Получить данные XML из загруженного текста.
  5. Разобрать атрибуты XML.
  6. Проверьте, изменилась ли переменная оценки, и вызовет то, что вы хотите .
  7. Подождите 100 мс.
  8. (асинхронная пауза)
  9. Перейти к шагу №1.

Примерно так:

var theLoader:URLLoader;
var theScore:Number = 0;
var theTimer:Timer;

// Start the tracking routine.
trackNext();

function trackNext():void
{
    theLoader = new URLLoader;
    theLoader.addEventListener(Event.COMPLETE, onXML);

    // Error tracking is a must or the logic flow
    // might just stop when you least expect it to.
    theLoader.addEventListener(IOErrorEvent.IO_ERROR, onError, false, 0, true);

    theLoader.load(new URLRequest("xml.xml"));
}

function onXML(e:Event):void
{
    // Sanity check. There should be only one valid URLLoader instance.
    if (e.target != theLoader)
    {
        return;
    }

    var X:XML;

    try
    {
        X = new XML(theLoader.data);
    }
    catch (fail:Error)
    {
        // Processing the case where data is loaded successfully,
        // but it is not a valid XML String.
        onError(e);
        return;
    }

    // Here's the place for your code
    // that extracts data from XML.
    // ...

    // Get the new score value.
    var aScore:Number = X.HomeScore;

    // Compare it to previous value.
    if (aScore != theScore)
    {
        // ATTENTION!!! THIS IS THE PLACE YOU ARE LOOKING FOR!!!
        // Trigger things if the new score is any different.
        // ...

        // Keep the new score value.
        theScore = aScore;
    }

    finishLoading();
}

// This method just ignores an error, think of it
// as of blank to process the exceptional cases.
function onError(e:Event):void
{
    // Sanity check. There should be only one valid URLLoader instance.
    if (e.target != theLoader)
    {
        return;
    }

    finishLoading();
}

// Call it finishLoading(true) to stop the tracking routine.
function finishLoading(thenstop:Boolean = false):void
{
    // Dispose of the URLLoader instance if any.
    if (theLoader)
    {
        var aLoader:URLLoader = theLoader;

        theLoader = null;

        aLoader.removeEventListener(Event.COMPLETE, onXML);

        try
        {
            aLoader.close();
        }
        catch (fail:Error)
        {
            // Do nothing about it.
        }
    }

    finishTimer();

    if (thenstop)
    {
        return;
    }

    // Wait 100 ms to give Flash Player a breather
    // before starting to load the file once more.
    theTimer = new Timer(100, 1);
    theTimer.addEventListener(TimerEvent.TIMER, onTime);
    theTimer.start();
}

function finishTimer():void
{
    // Dispose of the Timer instance if any.
    if (theTimer)
    {
        theTimer.removeEventListener(TimerEvent.TIMER, onTime);
        theTimer.stop();
        theTimer = null;
    }
}

function onTime(e:TimerEvent):void
{
    // Now go for the next iteration.
    finishTimer();
    trackNext();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...