Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Неадекватное исполнение метода LoadVars.sendAndLoad() (http://www.flasher.ru/forum/showthread.php?t=131649)

Сникерс 25.10.2009 14:37

Неадекватное исполнение метода LoadVars.sendAndLoad()
 
У меня есть мой код, в нём циклично создаются пустые клипы, в которые циклично загружаются клипы из библиотеки. Потом они все разворачиваются под разными углами и проверяются на возможность выхода за пределы сцены. А потом запускаются. В одном пустом клипе могут быть несколько клипов. Метод
Код AS1/AS2:

LoadVars.sendAndLoad()

находится вне пределов кода цикла. И этот метод перестаёт работать, если итераций цикла больше 17:
Код AS1/AS2:

for(var i = 0; i<30; i++) {
  //Здесь создаются клипы и задаются их свойства
}
derevo.sendAndLoad(...) //Здесь это НЕ работает

Код AS1/AS2:

for(var i = 0; i<17; i++) {
  //Здесь создаются клипы и задаются их свойства
}
derevo.sendAndLoad(...) //Здесь это работает

Хотя даже в первом случае
Код AS1/AS2:

trace(derevo.sendAndLoad(...)); //Выводит true

Вы не могли бы мне это объяснить?

udaaff 25.10.2009 15:03

Маловато кода... непонятно.

mooncar 25.10.2009 15:05

Что-то вас не понятно. Сперва вы пишите, что у вас "циклично загружаются клипы из библиотеки", а в разрозненных строчках вашего вопроса речь идет о LoadVars и его методах.
Приведите-ка полный кусок кода. Да и вопрос уточните.

Сникерс 25.10.2009 16:01

Код AS1/AS2:

var derevo:LoadVars = new LoadVars();
var resultDerevo:LoadVars = new LoadVars();
derevo.load("../dermo.txt");
derevo.onLoad = function() {
        for (var i = 0; i<30; i++) {
                _root.createEmptyMovieClip("name"+i+"_mc",_root.getNextHighestDepth());
                for (var d = 0; d<8; d++) {
                        _root["name"+i+"_mc"].attachMovie(derevo["name"+(i+1)].charAt(d)+"clip","clip"+d,d+1+(8*i),{_x:0+30*d, _y:0});
                }
                _root["name"+i+"_mc"]._x = derevo["name"+(i+1)+"_x"];
                _root["name"+i+"_mc"]._y = derevo["name"+(i+1)+"_y"];
                _root["name"+i+"_mc"]._rotation = derevo["rotation"+(i+1)];
                for (d=10; d<1015; d++) {
                        while (_root["name"+i+"_mc"].hitTest(d, 50)) {
                                _root["name"+i+"_mc"]._y += 1;
                        }
                        while (_root["name"+i+"_mc"].hitTest(d, 718)) {
                                _root["name"+i+"_mc"]._y -= 1;
                        }
                }
                for (d=50; d<719; d++) {
                        while (_root["name"+i+"_mc"].hitTest(10, d)) {
                                _root["name"+i+"_mc"]._x += 1;
                        }
                        while (_root["name"+i+"_mc"].hitTest(1014, d)) {
                                _root["name"+i+"_mc"]._x -= 1;
                        }
                }
        }
        _root.onEnterFrame = function() {
                for (var i = 0; i<30; i++) {
                        for (var d = 0; d<8; d++) {
                                eval("name"+i+"_mc.clip"+d).play();
                        }
                }
                delete this.onEnterFrame;
        };
          derevo.num = Number(visitors.num)+1;
          derevo.name1 = "bobik";
        derevo.sendAndLoad("FlashDataHandler.ashx",resultDerevo,"GET");
}

Здесь
Код AS1/AS2:

derevo.sendAndLoad(...);

не работает, но если в условии самого первого цикла вбить
Код AS1/AS2:

for(var i = 0; i<17; i++) {
...
}

, то "sendAndLoad" заработает. Из-за чего это происходит?

mooncar 25.10.2009 23:04

Почему у вас вызов derevo.sendAndLoad(....); записан внутри его же обработчика onLoad?
Код AS1/AS2:

var derevo:LoadVars = new LoadVars();
var resultDerevo:LoadVars = new LoadVars();
derevo.load("../dermo.txt");
derevo.onLoad = function() {
...
        derevo.sendAndLoad("FlashDataHandler.ashx",resultDerevo,"GET");
}

Вот это действительно неадекватное исполнение методов LoadVars.

Сникерс 26.10.2009 00:35

Да там всё нормально. После загрузки и исполнения кода обновлённые данные отправляются на серверную страницу и ответ загружается в другую переменную и не может быть рекурсии. А ведь "onLoad" - это асинхронная функции и она будет выполняться в самом конце. Вне обработчика "onLoad" все данные переменной "derevo" были бы недоступны.

udaaff 26.10.2009 01:00

Script time limit скорее всего превышается... Оптимизируйте свой код.
Ссылку на текущий мувиклип ("name"+i+"_mc" который) хотя-бы в переменную записывайте что-ли. Посчитайте сколько у вас лишних вычислений получается.

mooncar 26.10.2009 01:51

Сникерс, а вы в курсе, что у вас все переменные, полученные в derevo после этой загрузки
Код AS1/AS2:

derevo.load("../dermo.txt");

попадают вновь в GET-запрос по новой даже без явного присвоения типа
Код AS1/AS2:

derevo.name1 = "bobik";

?
То есть все вот эти derevo["name"+...] вновь образуют пары "переменная=значение" и вновь отправляются на сервер уже при derevo.sendAndLoad. Сколько у вас их там, 30 пар? И сама onLoad тоже уходит на сервер в виде строки
Код:

onLoad=%5Btype%20Function%5D
Я бы все-таки разделил экземпляры LoadVars. Или вы так задумали?

Сникерс 26.10.2009 14:49

Точно так, udaff. Я объявил такую переменную и теперь метод "sendAndLoad" работает доже после 21-ой итерации цикла. Только как теперь мне ещё больше упростить код, там по-моему в остальном это нельзя сделать. А может быть изменить значение "Script time limit" и сделать его больше?

Да, mooncar, это правда, я знал, что туда отправляются все пары. Из этого кадра мне нужно отправить только "derevo.num". Я подумал, что буду отправлять всё вместе, потому что всё равно остальное не будет изменяться. Пока я тестирую на двух объектах, то есть пока у меня отправляется 8 пар "имя-значение", но всего их может быть до 120-ти. А пока создаются только 2 клипа, но с изменением количества итераций цикла "sendAndLoad" не работает. udaff оказался прав и мне надо оптимизировать мой код, только я не знаю что ещё сделать. Может быть изменить значение "Script time limit"?

mooncar 26.10.2009 15:02

1. Разделите экземпляры LoadVars. Для каждого действия все-таки лучше свой экземпляр.
2. Используйте не GET, а POST. Все-таки в адресной строке передавать такое количество данных как-то нехорошо - 120 пар, как вы говорите.


Часовой пояс GMT +4, время: 21:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.