Просмотр полной версии : как убить Object или function?
minimalistic
11.01.2008, 19:50
есть 2 кадра на временной шкале
в одном написано к примеру:
testObj = new Object();
testObj.onResize = function ()
{
setProperty(_root.test, _y, Math.round(Stage.height)/2);
};
testObj.onResize();
Stage.addListener(testObj);
в другом:
testObj = new Object();
testObj.onResize = function ()
{
setProperty(_root.test, _y, Math.round(Stage.height)/2-600);
};
testObj.onResize();
Stage.addListener(testObj);
Но почему-то при переходе во второй функции заданные в первом сохраняются, а не обновляются полностью.
Потому что сначала надо старый testObj отписать от Stage.
Во втором кадре добавте первой строчкой
Stage.removeListener (testObj);
minimalistic
11.01.2008, 20:59
не удаляется (
minimalistic
11.01.2008, 22:28
мой код в первом кадре:
if (Stage.height >= 800){
_root.main._height = Stage.height;
_root.main._width = Stage.height*1.6;
_root.main._y = 0;
sizeListener = new Object();
sizeListener.onResize = function (){
_root.main._height = Stage.height;
_root.main._width = Stage.height*1.6;
_root.main._y = 0;
gotoAndPlay(1);
};
Stage.addListener(sizeListener);
}
else {
_root.main._width = 1280;
_root.main._height = 800;
setProperty(_root.main, _y, Math.round(Stage.height)/2-450);
mainObj = new Object();
mainObj.onResize = function (){
_root.main._width = 1280;
_root.main._height = 800;
setProperty(_root.main, _y, Math.round(Stage.height)/2-450);
gotoAndPlay(1);
};
mainObj.onResize();
Stage.addListener(mainObj);
};
во втором:
_root.main._width = 2900;
_root.main._height = 1812;
mainObj = new Object();
mainObj.onResize = function ()
{
_root.main._width = 2900;
_root.main._height = 1812;
setProperty(_root.main, _x, Math.round(Stage.width)/2-1128);
setProperty(_root.main, _y, Math.round(Stage.height)/2-1072);
};
mainObj.onResize();
Stage.addListener(mainObj);
Mr. Fixit
11.01.2008, 22:46
вообще советую делать все в одном кадре..
а так переопределяй переменные..
minimalistic, ну и где отписка всех предыдущих слушателей во втором кадре?
minimalistic
12.01.2008, 02:24
Ну вот.
Добавляю во второй кадр:
Stage.removeListener(mainObj);
вроде нечего больше отписывать. Или я не прав? Что-то еще осталось?
Ну, например, sizeListener тоже может быть.
И где добавляется строчка? В начале кода во втором кадре или в конце? Вы вообще понимаете, что эта строчка делает и какова логика всего этого или нет?
minimalistic
12.01.2008, 03:08
Да. Я уже пробовал удалять все листнеры. Добавив в 1-2 строчки второго кадра:
Stage.removeListener(sizeListener);
Stage.removeListener(mainObj);
На 90% логику понимаю. Осталось только сомнение в необходимости обнулять setProperty.
Мне не понятна логика вашего кода.
1. У вас зациклинная анимация. stop () нигде нет.
2. Исходя из пункта 1, removeListener нужно ставить в обоих кадрах, иначе количество ссылок на подписанный объекты растет.
Чтобы проверить, вставте в первый кадр:
trace (Stage["_listeners"].length);
3. Зачем переопределять объект, когда можно было просто переписать onResize?
setProperty умер ещё в пятом флеше в 2000-ом году, так, между прочим.
minimalistic
12.01.2008, 04:14
Ого. Совсем отстал. Просто раньше применял для AS1 Flash6.
А как сейчас максимально грамотно записать для AS2 этот код без зацикливания?
stop();
Stage.scaleMode = "noScale";
Stage.align = "TL";
testedObj = new Object();
testedObj.onResize = function ()
{
setProperty(_root.tested, _y, Math.round(Stage.height));
};
testedObj.onResize();
Stage.addListener(testedObj);
AS2 — код в классах, а не в кадрах.
А это как было, так и останется AS1.
stop();
Stage.scaleMode = "noScale";
Stage.align = "TL";
onResize = function ()
{
_root.tested._y = Math.round(Stage.height);
};
onResize();
Stage.addListener(this);
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.