Почему Actionscript 2.0 выдает здесь непредсказуемый результат?

Я делаю некоторую работу в Actionscript 2.0 в первый раз за некоторое время (действительно простые вещи, просто извлечение содержимого из текстового файла), и я не могу понять, почему я получаю такой непредсказуемый результат здесь.

Иногда, когда я тестирую сборку такого простого скрипта, переменные отображаются как неопределенные, а иногда нет.

Я предполагаю, что это может быть связано с тем, что данные, загруженные из cookware.txt, еще не были загружены в память, но, похоже, это не так - согласно словарю Actionscript здесь функция onLoad срабатывает только тогда, когда данные загружены, поскольку они доступны для остальных программа.

Кто-нибудь может пролить свет? Или посмотреть, почему это может происходить?

Содержимое cookware.txt:

pots=44&kettles=43

Код

_global.pots;
_global.kettles;

trace('variables not assigned')
trace('before: kettles (global) = ' + _global.kettles);

trace('before: pots (global) = ' + _global.pots);

var my_lv:LoadVars = new LoadVars();

my_lv.onLoad = function(success:Boolean):Void {
    if (success) {

        trace('variables clearly loaded: kettles = ' + kettles); 

        _global.kettles = this.kettles;

        trace('assigned during loop: kettles in = ' + _global.kettles); 


        trace('pots = ' + kettles);

        _global.pots = this.pots;

        trace('during: pots = ' + _global.pots);

     } else {
        trace("Error");
    }
}


my_lv.load("cookware.txt");

trace('after: kettles (global) = ' + _global.kettles);

trace('after: pots (global) = ' + _global.pots);

Вывод::

Иногда это:

variables not assigned
before: kettles (global) = undefined
before: pots (global) = undefined
after: kettles (global) = undefined
after: pots (global) = undefined
variables clearly loaded: kettles = undefined
assigned during loop: kettles in = 43
pots = 43
during: pots = 43

а иногда вот это:

variables not assigned
before: kettles (global) = 43
before: pots (global) = 44
after: kettles (global) = 43
after: pots (global) = 44
variables clearly loaded: kettles = 43
assigned during loop: kettles in = 43
pots = 43
during: pots = 43

Опять же, то, являются ли переменные неопределенными или нет, кажется совершенно случайным. Что здесь происходит?


person Chris Adams    schedule 23.01.2009    source источник


Ответы (4)


Скорее всего, у вас возникли проблемы с цепочкой областей действия. То, как это работает во Flash, очень запутанно. Короткий ответ — назвать ваши _global.pots и _global.kettles как-то иначе, чем то, что используется во внешнем файле, чтобы избежать коллизий.

Проблема в том, что внутри вашей функции объект "чайники" будет ссылаться на локальный объект "this.kettles", но только если он определен. Если это не так, то он будет ссылаться на объект "_global.kettles". Это затрудняет прогнозирование поведения настройки OnLoad.

person DavGarcia    schedule 24.01.2009

Небольшие предложения по области: создайте переменную currentTimeline = _level0 (или ваш levelN), которую вы можете использовать внутри секции успеха вашей функции onLoad, избегайте конфликтующих имен и используйте _global только в случае крайней необходимости.

person Community    schedule 24.01.2009

Возможно, здесь есть некоторые проблемы с областью действия, но я просто не понимаю, как

before: kettles (global) = 43

когда-нибудь случится - вы еще даже не вызвали load. И

after: kettles (global) = 43

вероятно, тоже не должно работать, так как загрузка будет выполняться асинхронно. Казалось бы, флеш-плеер кэширует переменные _global между проигрываниями, но я не слышал об этом раньше. Как вы это строите? Вы каждый раз просто компилируете swf во Flash IDE?

И да, то, что Дэвид сказал об области видимости и об этом, особенно в том, что я бы прослеживал this.kettles вместо просто чайников для согласованности.

person Andrew    schedule 27.01.2009

Спасибо за помощь, ребята - я не щелкал раньше, что LoadVars() была асинхронной функцией, и что остальная часть скрипта будет продолжаться без проверки того, загружена ли она.

Мне удалось исправить это, проверив завершение loadVar в каждом кадре, а затем выполнив код после завершения loadVar.

У меня была компиляция swf для тестирования (команда+возврат).

person Chris Adams    schedule 02.02.2009