Форум 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)
-   -   MC: ссылка на себя. Правильно-ли? (http://www.flasher.ru/forum/showthread.php?t=143984)

mj_nooker 30.08.2010 21:41

MC: ссылка на себя. Правильно-ли?
 
Привет!

В мувике создаю ссылку на самого себя:
Код AS1/AS2:

var thisLink:MovieClip = this;

для того, чтоб потом без проблем и путанины обращаться к нему в его функциях, присваивать твины и переменные, и т.д.

В целом, приём пока работает.

Но решил спросить у людей, имеющих опыт побогаче моего:
  1. Правильно-ли я делаю, что создаю и использую такую ссылку?
  2. Какие возможные баги и скрытые камни данного способа?
  3. Правильно-ли я делаю, что объявляю её тип как MovieClip? может правильнее Object? или вообще не объявлять?
    Тоесть есть-ли вариант более правильного объявления?
  4. Есть-ли вариант (приём) вообще более правильный, чем создание ссылки на самого себя (если баги у данного способа всё-таки есть)?

Что более правильнее:
Код AS1/AS2:

var thisLink:MovieClip = this;

Код AS1/AS2:

var thisLink = this;

Код AS1/AS2:

thisLink = this;

?

Спасибо!

mooncar 30.08.2010 22:49

Вы все делаете нормально.
А тип данных, конечно же, лучше объявлять.

rainbowrussia 30.08.2010 23:08

Для чего в самом себе делать ссылку на самого себя?

FriOne 30.08.2010 23:43

Тож интересно.. nj_nooler вам для чего?

mooncar 30.08.2010 23:51

Иногда бывает надо.
Например, бывают функции, в которых если употребить this, то ссылка будет не на текущий объект, где написан код.
А обратиться нужно.

Добавлено через 10 минут
Вот пример:
Код AS1/AS2:

import mx.transitions.Tween;
var NoN:Object = mx.transitions.easing.None.easeNone;
 
var curr:MovieClip = this ;
 
xTween(my_mc, my_mc._x + 100, 3);
 
function xTween (mc:MovieClip, fin:Number, t:Number)
{
        var mcOn:Tween = new Tween(mc, '_x', NoN, mc._x, fin, t, true);
        mcOn.onMotionChanged = function()
        {
        //допустим, в этой функции нужно ссылаться на текущий таймлайн, чтобы например, обратиться
        // к каким-то другим объектамм на нем - переменным, мувикам               
 
        //тут, внутри обработчика события, this будет ссылаться на объект Tween,
        //например, можно выводить текущее время твина:
        trace(this.time);
        //а вот как сослаться на текущий таймлан?
 
        //один способ - задали в начале ссылку на текущий таймлайн и ее используем
        trace(curr);
 
        //второй  способ:
        trace(this.obj._parent);
        // - используя внутреннее свойство Tween obj - ссылку на объект, над которым tween выполняется       
        //но это не очевидно - обращаемся к текущему таймлайну как к родителю мувика,
        //который там находится, который двигаем. Кривовато. Потому 1-й способ лучше.
        };
}


udaaff 31.08.2010 00:09

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

upd: иначе непонятно зачем это надо.

etc 31.08.2010 00:13

1. Нет;
2. Сжирает память, нечитабельный код;
3. В данном случае это не принципиально ввиду п. 1;
4. Delegate.

Что такое хорошо? 31.08.2010 02:12

Код AS1/AS2:

trace(targetPath(this));


mj_nooker 31.08.2010 15:24

mooncar, спасибо за точный и втемный ответ

Цитата:

Сообщение от udaaff (Сообщение 932495)
Я так понял, что автор на классах пишет.

нет

Цитата:

Сообщение от etc (Сообщение 932496)
2. Сжирает память, нечитабельный код;

а почему сжирает? смотрел на расход памяти и на загрузку проца - ничего не заметно.
остальные пункты ответа проигнорены ввиду их несоответствия действительности :)

Цитата:

Сообщение от Что такое хорошо? (Сообщение 932519)
Код AS1/AS2:

trace(targetPath(this));


ээ.. а что это? как с помошью этого обратиться к мувику родителю твина в функции, вложенной в функцию onMotionFinished? ;)

Цитата:

Сообщение от rainbowrussia (Сообщение 932470)
Для чего в самом себе делать ссылку на самого себя?

прежде чем отвечать - относитесь внимательно и с уважением к мыслям писаки ))

всем ответившим спасибо!

etc 31.08.2010 15:36

Цитата:

Сообщение от mj_nooker (Сообщение 932641)
остальные пункты ответа проигнорены ввиду их несоответствия действительности :)

Что значит «не соответствует действительности»? Вы считаете, что делаете правильно? ОК, тогда зачем была создана тема?

rainbowrussia 31.08.2010 15:52

Цитата:

Сообщение от mj_nooker (Сообщение 932641)
прежде чем отвечать - относитесь внимательно и с уважением к мыслям писаки ))

Я что написал что-то оскорбительное или неуважительное? Я поинтересовался зачем это нужно и получил на это внятный ответ. "Писака" в исходном сообщении не дал на это и намека.

mj_nooker 31.08.2010 21:03

Цитата:

Сообщение от etc (Сообщение 932642)
Что значит «не соответствует действительности»? Вы считаете, что делаете правильно? ОК, тогда зачем была создана тема?

Всё ровно, я ничего не считаю. Ну не виноват я, что слово "проигнорены" имеет такую вызывающую личностную окраску :) Я просто ответил, что одна строчка объявляения ссылки - это меньше, чем описывать Delegate, да и нечитабельность кода - наверное не из той оперы, ибо, если я Вас правильно понял, с каких пор он становится нечитабельным из-за стандартного объявления переменной?
var linkToHead:MovieClip = this;
По поводу памяти - есть какой-нить обосновательный скриншот, показывающий ацкую загрузку памяти и, как следствие, переубеждающий меня именно из-за этого не использовать сею технику?
Тема была создана, чтоб получить много разных мнений, расставить точки над j и поразмышлять-подискутировать на тему, не более. Чем мы, собсно, и занимаемся ;)

Цитата:

Сообщение от rainbowrussia (Сообщение 932645)
Я что написал что-то оскорбительное или неуважительное? Я поинтересовался зачем это нужно и получил на это внятный ответ. "Писака" в исходном сообщении не дал на это и намека.

:))
Тут опять-таки, общение в пластмассе придало суровую окраску моему ответу Вам.
Имелось в виду, что вот не спишь ты двое суток, пишешь/кофеинишь/куришь, взъерошиваешь на голове волосы и не успеваешь. Заходишь на форум, чтоб спросить что-то важное для тебя. Пишешь фразу "...делаю это для...", а человек (вероятно тоже сутками копающийся в коде:)) отвечает " а зачем Вы это делаете?". Сразу напрашивается вывод, что человек невнимательно отнёсся к реквесту "о, мол, ща читнём, чё тут ?" и, после прочтения темы по диагонали - ну сразу-же отвечать. Это имелось в виду. А не "братан, ты меня не уважаешь шоле?" В целом, против ответов я ничего не имею)) Просто иногда грустновато, что модеры плюсуют за неоформленный код, а за мессаги, отвеченные не в контексте нет.

В целом, резюмирую, для себя я сделал вывод (на основании практики + ответов в ветке), что линк - это удобно и правильно. Пока фактов обратной/негативной стороны не предоставлено, я, как и любой другой человек, не спешу вестись на просто слова.

etc 31.08.2010 21:17

Гораздо проще находиться всегда в одной и той же области видимости, не заморачиваясь со левыми ссылками на самого себя и не убивая память вложенными функциями (засорение памяти не означает её переполнение, просто отлаживать подобный код в случае неработоспособности крайне тяжело). Т. к. код вы пишете в кадрах, то адекватным вариантом будет следующее:

Код AS1/AS2:

import mx.utils.Delegate;
function onMotionFinished(obj:Object):Void {
    trace(['Finish: ', this]); // Остаемся в нормальной области видимости без ссылок
}
tween = new Tween(...);
tween.onMotionFinished = Delegate.create(this, this.onMotionFinished);
trace(['Begin: ', this]);

Если вас не удовлетворяют мои слова, как специалиста со стажем, то вы можете найти того, кто потратит время на скриншоты и прочую муть. У меня на это времени, увы, нет.

mj_nooker 31.08.2010 21:18

etc, и всё-таки, пожалуйста, напиши хотя-бы кратенький примерчик применения Delegate в данном случае ("для удобства обращения").

Добавлено через 39 секунд
упс, одновременно ответили :)

Добавлено через 3 минуты
А, имелось в виду жор памяти вложенными функциями. Да, об этом читал. Но в открывающем ветку посте я имел в виду использование не только во вложенных функциях.

Спасибо за пример, полезно!

etc 31.08.2010 21:22

Я отредактировал слегка пост.

rainbowrussia 31.08.2010 21:49

Цитата:

Сообщение от mj_nooker (Сообщение 932741)
Заходишь на форум, чтоб спросить что-то важное для тебя. Пишешь фразу "...делаю это для...", а человек (вероятно тоже сутками копающийся в коде:)) отвечает " а зачем Вы это делаете?". Сразу напрашивается вывод, что человек невнимательно отнёсся к реквесту

Ну да, не уловил сразу суть, сорри.

mj_nooker 31.08.2010 21:55

Цитата:

Сообщение от etc (Сообщение 932745)
Если вас не удовлетворяют мои слова, как специалиста со стажем, то вы можете найти того, кто потратит время на скриншоты и прочую муть. У меня на это времени, увы, нет.

etc, относительно длины Вашей короны не имею ничего против. Почему я должен объяснять, что ПРОСТО СЛЕПО верить авторитетным людям - не есть правильно. Как пример - миллионы верующих - верят в Б-га просто потому, что им сказали "так есть. точка. верь", а сами они не разобрались в примере. Плохой пример о Б-ге? Хорошо, есть другой - об IBM и Apple - есть просто Юзеры, которые Просто Верят, а есть Оверклокеры, которые ещё и разбираются "почему лучше".
Именно поэтому я попросил подтверждение "просто словам", а не потому, что мне 30 и я дерзкий тип )
И перестаньте меня провоцировать так-же болезненно реагировать на Ваши ответы, как Вы - на мои !))))))))

Да, и ещё - что значат квадратные скобки в трейсе? Впервые встретил :cool:

rainbowrussia 31.08.2010 22:07

Цитата:

Сообщение от mj_nooker (Сообщение 932759)
Да, и ещё - что значат квадратные скобки в трейсе? Впервые встретил :cool:

Скобки делают из перечисленных переменных массив, что облегчает трассировку и избавляет от конструкций вида " + '; ' + ".

mj_nooker 04.09.2010 10:59

спасибо! намного облегчилась моя трассировка! :)


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

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