Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Некорректное срабатывание Tween (http://www.flasher.ru/forum/showthread.php?t=101600)

Torero 23.09.2007 04:38

Некорректное срабатывание Tween
 
Допустим, есть кнопка, улавливающая событие MOUSE_OVER, при наступлении которого, выполняется ряд операций.
С учетом того, что событие срабатывает часто и переменных довольно много(10-15):
Правильно-ли каждый раз объявлять переменные в функции, вызываемой событием?
Код:

public function testfunc(){
        addChild(someObj);
        someObj.addEventListener(MouseEvent.MOUSE_OVER, mousefunc);
        function mousefunc(event:MouseEvent):void{
                var a..
                var b..
                var c..
                var d..

                ..
                ..
        }
}

..или лучше объявить их 1 раз?
Код:

public function testfunc(){
        var a..
        var b..
        var c..
        var d..

        addChild(someObj);
        someObj.addEventListener(MouseEvent.MOUSE_OVER, mousefunc);
        function mousefunc(event:MouseEvent):void{
                ..
                ..
        }
}


miramax 23.09.2007 05:20

По-моему есть более важные проблемы в оптимизации....
Например генерация и рассылка самого события ест времени больше на несколько порядков.

Torero 23.09.2007 07:10

Млин, тогда я вообще не понимаю в чем проблема:
Есть xml-меню. При срабатывании мышиного события на кнопках, начинается множественный tween(различные элементы кнопки двигаются/поворачиваются/становятся прозрачными и т.п.).
Проблема в том, что когда быстро передвигаю мышь с кнопки на кнопку в течении 10-15 секунд, tween, сработавший в какой-либо из кнопок, может запросто застрять где-то на середине..
Схематично, код выглядит следующим образом:
Код:

1.Создаю массив элементов меню:
var menuItem[i]:Array;
2.Создаю массив спрайтов/текстфилдов, из которых состоит данный элемент меню(фон кнопки, кружочки,
звездочки, текстовые элементы и т.п.):

var menuItem[i].elem=[];
3.Создаю спрайт-перехватчик мышиных событий:
var menuItem[i].lst=new Sprite()
4.При возникновении мышиного события перехожу к функции, видоизменяющей кнопку соответственным
образом:

menuItem[i].lst.addEventListener(MouseEvent.MOUSE_OVER, tweenItem);
menuItem[i].lst.addEventListener(MouseEvent.MOUSE_OUT, tweenItem);
menuItem[i].lst.addEventListener(MouseEvent.MOUSE_DOWN, tweenItem);
5.При срабатывании функции, определяю тип события, и перебираю все составные элементы данного
элемента меню.

for (var j:uint j<menuItem[i].elem.length())
6.У каждого из составных элементов перебираю, описанные в XML, параметры. Если значение параметра
указано для данного мышиного события, запускаю tween.

myTween = new Tween(menuItem[i].elem[j], param, None.easeNone, this_elem_current_param_value, this_elem_new_param_value, 0.5, true);
6а.Пробовал создать массив Tween-ов - не спасает.
myTween[kkk] = new Tween(menuItem[i].elem[j], param, None.easeNone, startValue, finishValue, 0.5, true);
kkk++;

Где искать ошибку?

------
Модераторам: Переименуйте пожалуйста тему в "Некорректное срабатывание Tween"

__i 23.09.2007 13:15

Ошибка судя по всему в твиновом классе, т.к. я тоже сталкивался с тем что твин "залипает" посреди движения, причем зависимость мне поймать не удалось, сложного ничего в моем коде небыло (просто меняется размер!)

DarkLight 23.09.2007 13:38

Да, с залипанием твина проблема есть. Делал приложение где до 40 твинов одновременно выполняется какждые 5 секунд. Вероятность залипания гдето 1% была. Пришлось делать принудительный fforward всем твинам через небольшой промежуток после расчетного времени окончания.(твины были движение и смена прозрачности)

Torero 23.09.2007 17:18

Спасибо за ответы.
Час просиживания в гугле, привел меня к следующему оттвету на одном из буржуйских форумов:

I had this very same problem and it drove me crazy for a few days, I found this on adobe's site:

Note: Consider variable scope when using the Tween class. If a tween is created in a function, it is important that the variable's scope exists beyond the function itself. If a tween is stored to a variable of local scope, ActionScript garbage collection removes the tween as the function completes, which will likely be before the tween has even begun.

I made my tween variables class members and everything started working correctly.
------------------------
объясните пжл: Что они имеют в виду?

DarkLight 23.09.2007 17:37

Дошло....вобщем если создаешь внутри функции твин как локальную переменную, после исполнения функции ссылка исчезает и твин рискует быть собранным сборщиком мусора и перестанет работать соответственно. Ссылки на твины надо хранить в свойствах класса например, чтобы они не терялись. Поэтому и ошибка трудноуловимая.

Спасибо за информацию!

Torero 23.09.2007 18:00

Проблема не в переводе - с инглишем все в норме.. Я не понимаю смысл. Что значит "Ссылки на твины надо хранить в свойствах класса"?

Код:

package {
import ....
        public class SomeClass extends Sprite {
                public var myTween:Tween
                public function SomeClass(){
                        ..
                        ..
                        ..
                        function tweenFunc():void{
                                ..
                                ..
                                myTween=.......
                        }
                }
        }
}

Что не так?

DarkLight 23.09.2007 18:18

Все так. Если в этой ситуации зависают, проверяй, закончился ли твин у клипа до присвоения ему нового. если нет - сначала принудительно заканчивай предыдущий или делай continueTo...

Torero 23.09.2007 18:23

Цитата:
6а.Пробовал создать массив Tween-ов - не спасает.
Код:

myTween[kkk] = new Tween(current_object, param, None.easeNone, startValue, finishValue, 0.5, true);
kkk++;

Бред какой-то.. Может нужно еще и current_object-ы в массиве хранить?

vvk80 24.09.2007 12:04

сталкивался с аналогичной проблемой...
поробовал предложенное Torero решение...
залипание стало меньше но все равно остается...

как вариант в моем случае помог уход от Tween в пользу onEnterFrame..., но с tweenом, конечно, удобнее и код проще...

Kikasso 24.09.2007 12:28

Я не понимаю, а continueTo() в AS3 нет? У вас случайно твины друг с другом не бьются?

Torero 24.09.2007 18:06

2Kikasso:
Цитата:

Сообщение от Kikasso
Я не понимаю, а continueTo() в AS3 нет?

И что с ним делать? DarkLight уже озвучил идею с fforward, но это не выход.. (точнее, выход, но гемморойный во всех отношениях)
Цитата:

Сообщение от Kikasso
У вас случайно твины друг с другом не бьются?

Если вопрос понял правильно, то в предыыдущем посте на него уже ответил..
--------------
2All: А нельзя-ли заблокировать переменную для удаления "garbage collector"-ом?

fljot 25.09.2007 15:00

Цитата:

Сообщение от Torero
Проблема не в переводе - с инглишем все в норме.. Я не понимаю смысл. Что значит "Ссылки на твины надо хранить в свойствах класса"?

Код:

package {
import ....
        public class SomeClass extends Sprite {
                public var myTween:Tween
                public function SomeClass(){
                        ..
                        ..
                        ..
                        function tweenFunc():void{
                                ..
                                ..
                                myTween=.......
                        }
                }
        }
}

Что не так?

всё так. тоже меню с твинами для каждого объекта делал, причём твины могли ещё не остановится, а им уже следующую команду слали.
храню ссылки на твины именно как ты описал выше, но когда нужно твинуть объект куда-нибудь дальше - то:
1. если двигается - stop()
2. если с этого же места надо двигать то continueTo()
3. если с другого то new Tween

залипаний так нету.
(ещё было как-то раз в практике залипание, если после MOTION_FINISH сразу новый твин делать)

Torero 25.09.2007 16:22

Окончательно решил проблему:
1)Переменная, описывающая Tween, должна быть определена в классе.
2)В случае множества Tween-ов, они должны описываться массивом переменных..
На самом деле, я зря на Kikasso грешил, все он правильно сказал - у меня в коде была ошибка (отсутствовала выделенная белым строка) и, как он выразился, "твины бились".. ХЗ почему компилятор вообще в ошибку не вываливался..
Вот полностью рабочий шаблон: (зависаний нет вообще)
Код:

public Class SomeClass{
        private var tween_arr:Array;
        private var n:Number;

        public function SomeClass(){
                tween_arr=new Array();
                n=0;
                function mousefunc(){
                        tween_arr[n]=new Tween(......
                        n++;  //переодически переменную n можно обнулять
                }
        }
}

-----
Интересующимся: http://blog.illianced.com/2007/09/12/tween-oddities/
Данный вопрос разобран с примерами.

Kikasso 25.09.2007 17:36

Какое-то решение некрасивое, функция внутри функции ((
Борьбу твинов можно понаблюдать наглядно в это старой теме:
http://flasher.ru/forum/showthread.php?t=98511&page=2
Это конечно совсем не AS3, но проблема такая же.

Torero 25.09.2007 20:59

Насчет того, что одна функция внутри другой - бралось из конкретного кода, в рамках которого это приемлемо. Важно чтобы переменная объявлялась в классе.

loover 30.03.2009 03:26

если использовать yoyo твины все-равно глючат. есть ли этому yoyo альтернатива?


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

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