PDA

Просмотр полной версии : странное поведение loadVariables


beginnerflasher2005
08.09.2005, 12:43
Создаем клип, добавляем динамический текст и связываем его с переменной rr.
В первом кадре вводим:

rr=1;
this.loadVariables("rr.txt");
trace(rr);

Никак не могу понять, что за ерунда такая:
trace выдаёт 1
а динам. поле показывает 1 и сразу 2 (в файле прописано rr=2)

FreeLander
08.09.2005, 13:18
просто процесс загрузки переменных из файла занимает какое-то время, на тот момент, когда ты трэйсишь rr, загрузка ещё не завершилась

beginnerflasher2005
08.09.2005, 15:57
а как же в этом случае поступать, т.е. продолжить выполнение кода с гарантией что значение изменилось?

beginnerflasher2005
08.09.2005, 16:01
Пробовал так: - ролик "висит"

f=false;

rr=1;
this.loadVariables("rr.txt");
while (f==false) {};
trace(rr);

onData = function(){
f=true;
}

beginnerflasher2005
08.09.2005, 16:15
А вообще, конечно, интересный принцип работы ...
Если я вызвал loadVariables - то, наверное, я хочу сейчас прочитать значения переменных, а не когда получится.
А выходит, что значение переменной поменяется в непредсказуемое время, когда вовсе уже и не надо (код выполняется дальше).
Смысл?!...

3dmax
08.09.2005, 16:24
Я с этой проблемой столкнулся давно и мне предлжили такой вариант,
короче попробуй так:

loadVariables("rr.txt", "");
this.onEnterFrame=function()
{ if(rr) { //пока rr не станет чем-то, тоесть загрузится
trace(rr)
delete this.onEnterFrame;
}}
stop();

Я так уже много сделал и все работает. :cool:

А почему у тебя название файла и переменной одинаковые, не запутаешься? ;)

7thsky™
08.09.2005, 16:30
Смысл в том:

* Флэш timeline based, то есть привязка исполняемого сейчас кода к кадру, то есть кадр не кончиться и не перейдет на другой пока не очиститься стек функций

* Ты предлогаешь что на время пока твой файл будет грузиться, все должно не двигаться и ждать окончания загрузки? Смысл?

7thsky™
08.09.2005, 16:31
+ вообще хелп рулит, поиск тоже рулит, там это описанно и переписанно

beginnerflasher2005
08.09.2005, 16:54
Это все хорошо - переход на следующие кадры, стеки и т.д.
Но с другой-то стороны зачем мне нужны эти следующие кадры, когда переменная "не с тем значением".

Хорошо, вот я в справке то и посмотрел:
-"Обработчик события onData наступает при получении данных, вызванных методами loadVariables или loadMovie ". А почему же не работает вышеприведенный код с onData. Или обработчик не может выполниться пока идет код в кадре? Если так, то значит loadVariables не ждет загрузки, а обработчик ждет,

beginnerflasher2005
08.09.2005, 17:08
Я так уже много сделал и все работает. :cool:

А почему у тебя название файла и переменной одинаковые, не запутаешься? ;)

Спасибо, работает такой способ.
Не, не запутаюсь - тестовый кусочек кода.

beginnerflasher2005
08.09.2005, 17:24
Ребята, а почему такой вариант "не катит":

loadVariables("rr.txt", "");
while (rr==undefined) {};

7thsky™
08.09.2005, 17:30
попробуй осмыслить мои посты? ты пытаешься зациклить код во фрайме, тогда когда он не должен зацикливаться. через 15 сек, флэш даст ошибку, что код исполняется слишком долго.

3dmax
08.09.2005, 17:32
Слыш 7thsky™ ты лучше напиши как оно должно выглядеть :cool:

beginnerflasher2005
08.09.2005, 17:37
неужеле за 15 сек нельзя с винта загрузить переменную??????!!!!!!!!!

beginnerflasher2005
08.09.2005, 18:02
Ну фиг с ним, пусть идет выполнение кадра. Так значит следующий кадр не начнется пока код текущего на выполнится.

А почему же если в первый кадр вставить

loadVariables("rr.txt", "");

а во второй

trace(rr);
stop();

то всеравно переменная "undefined"

3dmax
08.09.2005, 18:05
а ты каким кодом это делаешь?

beginnerflasher2005
08.09.2005, 18:10
Просто делаю всего 2 ключевых кадра.

В первый вписываю :
loadVariables("rr.txt", "");

во второй:
trace(rr);
stop();

7thsky™
08.09.2005, 18:20
Где моддераторы только?! что трудно в хелпе посмотреть?

__onLoad = function (flag) {
if (flag) {
// загрузилось
nextAction ();
} else {
// ошибка в загрузке
} // end if
}


var lv:LoadVars = new LoadVars ();
lv.onLoad = __onLoad;
lv.load ('rr.txt');
nextAction = function () {
trace (lv.rr);
}

beginnerflasher2005
08.09.2005, 18:35
В справке хоть написано, что load - метод асинхронный
Значит весь остальной код кадра ты прадлагаешь запихать в "nextAction"?
Как-то не очень красиво и удобно.

7thsky™
09.09.2005, 01:44
Ну наконец то, хоть хелп открыл. прочитал, какой метод? асинхронный? о чем это говорит, этом что запустил команду загрузки какого то файла, и не дожидаясь загрузки пошел дальше работать, если пользоваться объектом LoadVars, то у этого объекта есть события onLoad, onData, которые тебе скажут что уже загрузилось, в nextAction ты можешь запихнуть переход на какой нить кадр или вызвать call ('TCallLabel'), если ты любишь код по кадрам распихивать, как тебе удобно

З.Ы. не изобретай велосипед, есть флэш и он работает ТАК, есть плюсы и есть минусы

beginnerflasher2005
09.09.2005, 18:24
Понимаешь, весь код хотел написать в одном кадре. Логика достаточно разветвленная. Предполагалось переодически проверять не изменилась ли переменная в файле. Теперь не знаю как "это все разрулить".

7thsky™
09.09.2005, 19:22
не важно насколько развлетленная логика, ее запросто можно реализовать в одном кадре, собственно любой нормальный программист так и делает

FreeLander
29.08.2006, 20:05
супер-супер гууд!о чём это ты, парень?