Почему у Actionscript 2.0 непредсказуемый результат? - PullRequest
1 голос
/ 24 января 2009

Впервые за некоторое время я делаю какую-то работу в 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

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

Ответы [ 4 ]

1 голос
/ 24 января 2009

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

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

0 голосов
/ 02 февраля 2009

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

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

Я выполнил сборку SWF для тестирования (команда + возврат).

0 голосов
/ 27 января 2009

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

before: kettles (global) = 43

когда-либо происходит - вы даже не вызывали load. И

after: kettles (global) = 43

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

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

0 голосов
/ 24 января 2009

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

...