Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Event Caller (http://www.flasher.ru/forum/showthread.php?t=177291)

Core_2_Duo 29.03.2012 02:19

Event Caller
 
Доброго времени суток.
Есть вопрос - как из события обратиться к тому мувиклипу, который его вызвал?
Пример:

Код AS3:

for (var j=0; j<xml.mob.length(); j++) {
        mob[j].timer.addEventListener(TimerEvent.TIMER, function (e:TimerEvent) {
                /* И вот здесь надо обратиться к этому mob[j] */
        });
}

Прошу вашей помощи)

Zebestov 29.03.2012 02:24

Срочно сменить стиль программирования, почитать книжки что ли!

Core_2_Duo 29.03.2012 02:30

Преотличнейший совет. Хотелось бы нагрубить, но не буду.
Это лишь маленький кусок кода, выполняемый в этом цикле. Ах да, забыл несколько строк после начала цикла.
Код AS3:

for (var j=0; j<xml.mob.length(); j++) {
        mob[j]=new Object; /* вот эти */
        mob[j].timer=new Timer(50, 50); /* вот эти */
        mob[j].timer.start(); /* вот эти */
        mob[j].timer.addEventListener(TimerEvent.TIMER, function (e:TimerEvent) {
                /* И вот здесь надо обратиться к этому mob[j] */
        });
}

Но к делу это имеет мало отношения

Vishapakahr 29.03.2012 02:39

e.target ... , те кусочки что вы написали просто кашмар ))

Wolsh 29.03.2012 02:49

"Event Caller" здесь new Timer(50, 50).
Обратиться к нему можно через свойство Event#target или Event#currentTarget.
Объект mob[j], у которого завели динамическое свойство и передали в него ссылку на new Timer(50, 50), никак из таймера а тем более события недоступен: таймер вовсе никак не обязан знать, какие объекты хранят на него ссылки. Тем более что этих объектов могут быть тысячи.

Core_2_Duo 29.03.2012 02:53

Хм, спасибо, это печально.
Интересно, что такого кошмарного в коде?
Поясните уж, если пишите

Vishapakahr 29.03.2012 03:12

Ну , зачем регистрировать столька таймеров ? зачем прикреплять к каждому обьекту свой таймер из внешной ссылки ? другое дело если есть класс , внутри него регистрируешь .. . Дело в производительности приложения , думаю в вашем коде он просто виснеть будет

wvxvw 29.03.2012 04:13

Код AS3:

for (var j=0; j<xml.mob.length(); j++) {
// var j=0 - не объявлен тип переменной.
// var j=0 - инфиксные операторы принято отделять пробелами за исключением обозначений типов.
// j никогда не будет больше int.MAX_VALUE, но так, как вы его объявили, он будет типа Number
// при этом будет выполнять более простые операции для целых чисел более сложным способом
// как для чисел с плавающей запятой.
// j<xml.mob.length() - см. инфиксные операторы.
// j<xml.mob.length() - это условие будет рассчитано каждый виток цикла. Оно само по себе
// представляет вложенный цикл т.е. цикл по всем детям xml с выборкой, потом цикл по
// всем детям mob с выборкой.
        mob[j]=new Object; /* вот эти */
        // см. инфиксные операторы.
        // mob судя по всему типа XMLList, поэтому код приведенный выше равносилен:
        // mob[j] = XML("");
        // что само по себе бессмысленно.
        // new Object; - использует неидиоматическую запись вызова конструктора
        // нужно, как минимум, new Object();
        // более того, существует короткая запись: {}, которая, кроме всего прочего
        // занимает меньше памяти (по случайному стечению обстоятельств).
        // Но хуже всего то, что использование динамического объекта в этом месте ничем не
        // обосновано. Нужно было создавать объект со статическим типом. Динамические
        // объекты нужно создавать только тогда, когда не-динамические создавать не возможно.
        mob[j].timer=new Timer(50, 50); /* вот эти */
        // вы повторяете одну и ту же операцию доступа к элементу по индексу. Нормальным
        // подходом было бы закешировать созданный вами ранее объект в переменную.
        // создавать новый Timer каждый раз - непозоволительное расточительство. Время всегда одно,
        // и от количества хронометров не изменится.
        mob[j].timer.start(); /* вот эти */
        // см. кеширование.
        // кроме всего, начав выражение с динамического доступа, и не приведя тип к какому-нибудь
        // статическому типу вы продолжаете пользоваться механизмом поиска свойств по имени
        // вместо того, чтобы позволить компилятору найти нужное свойство еще на этапе компиляции.
        mob[j].timer.addEventListener(TimerEvent.TIMER, function (e:TimerEvent) {
        // см. про отсутсвие типизации.
        // e:TimerEvent - очень короткое имя переменной. слово event не достаточно длинное,
        // для того, чтобы его сокращать. Однобуквенные переменные не пройдут никакой код-ревью.
        // кроме того, что вы в цикле понасоздавали таймеров, вы теперь еще понасоздавали
        // функций, в то время, как достаточно было бы только одной.
        // у функции не указан возвращаемый тип. - это предупреждение компилятора
        // т.е. скомпилируется, но в большинстве компаний которые производят продукцию
        // сколь-нибудь серьезного уровня с использованием AS3 такой код не разрешат
        // положить в репозитори.
                /* И вот здесь надо обратиться к этому mob[j] */
                // если бы вы исправили все остальное, ну или хотя бы принципиальную
                // часть, то этот вопрос у вас бы не возник, т.как проблема
                // решилась бы сама по себе.
        });
}


Nooob 29.03.2012 04:43

+ анонимная функция

Silicium 29.03.2012 10:49

итого резюме:
Цитата:

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


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

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