Форум 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)
-   -   чем заменить onLoad на мувиклипе? (http://www.flasher.ru/forum/showthread.php?t=108799)

ccwds 29.02.2008 17:58

чем заменить onLoad на мувиклипе?
 
Ну вот у меня куча мувиков на сцене.
В старину просто на каждом мувике писал onLoad, onRelease, onMouseOver и т.д.
Теперь, разумеется, хочется код из мувиков убрать.
С мышиными событиями все понятно,
Код:

my_mc.onRollOver = function() {
.....
}

и т.д.
А как быть с заменой onLoad извне?
Да, я понимаю, что существуют onLoadInit, onLoadComplete и т.д.,
но как я могу их использовать, если я программно не гружу и не создаю эти мувики, они просто уже есть у меня на сцене с соответствующими Instance Name-ами?

iNils 29.02.2008 18:08

onLoad нужен только в классах, если вы пишите код теперь в кадрах, то все содержимое onLoad просто выносится за пределы события.
Вместо
Код:

on (press) {
        trace (1 + this.a);
}
onClipEvent (load) {
        this.a = 1
        trace (this.a);
}
on (release) {
        trace (2 + this.a);
}

внутри клипа надо написать
Код:

this.onPress = function () {
        trace (1 + this.a);
};
this.onRelease = function () {
        trace (2 +  this.a);
};
this.a = 1
trace (this.a);

или, если доступ к клипу mc
Код:

mc.onPress = function () {
        trace (1 + this.a);
};
mc.onRelease = function () {
        trace (2 + this.a);
};
mc.a = 1;
trace (mc.a);


ccwds 29.02.2008 18:35

Спасибо!
Я просто не могу сообразить, как лучше все эти действия присвоить клипам от my_mc1 до my_mc100.
Запихать все в функцию и ее вызвать 100 раз циклом, передавая ей параметром текущее имя клипа? Или здесь изящнее великими и непонятными классами? :)

iNils 29.02.2008 18:43

Если клипы однотипные, то конечно лучше классом.

ccwds 29.02.2008 18:53

Да, на них на всех абсолютно одинаковые действия, они читают корневые переменные и в зависимости от собственного номера в собственном имени распоряжаются ими. :)

Котяра 01.03.2008 20:44

Цитата:

Сообщение от iNils
Если клипы однотипные, то конечно лучше классом.

Почему? чем хуже назначение действий в цикле?
Ничем.

iNils 01.03.2008 21:01

Цитата:

Сообщение от Котяра
Почему? чем хуже назначение действий в цикле?
Ничем.

Тем, что когда пишем класс, существует одна копия метода или события. А когда назначаем в цикле, то у каждого клипа своя копия. В итоге больший расход памяти.

chingachgoog 02.03.2008 01:17

Если экономить память, то вполне можно обойтись без классов:
вместо

Код:

mc.onRelease = function () {
        trace (2 + this.a);
};

написать:
Код:

//блок задания метода в цикле
mc.onRelease = f_1
//внешняя функция вне тела цикла
function f_1 () {
        trace (2 + this.a);
};

Что касается классов, то одна копия существует лишь при занесении метода в прототип класса, а если метод в конструкторе класса, то вовсе нет.

iNils 02.03.2008 01:34

Метод в конструкторе класса?

chingachgoog 02.03.2008 12:04

а вдруг потребуется метод с собственным свойством?

да собственно занесение метода в конструктор класса - это как раз аналог примера 1 поста 8, а занесение метода в прототип класса - аналог примера 2 поста 8.

iNils 02.03.2008 12:40

Не понял, с каким собственным свойством, для которого надо отдельный метод создавать?

udaaff 02.03.2008 13:30

to chingachgoog
Есть функции, а есть методы (экземпляра и статические). Не надо их спутывать между собой.

chingachgoog 02.03.2008 19:30

Цитата:

Сообщение от iNils
Не понял, с каким собственным свойством, для которого надо отдельный метод создавать?

Я хочу сказать, что задание метода в классе - не гарантия того, что метод не будет скопирован в каждый экземпляр класса. Все зависит от того, как в классе прописан метод (см. выше). Или я ошибаюсь?

Как пример привел следующую ситуацию: метод записан в самом конструкторе и у метода есть собственное свойство (тогда это свойство будет уникальным у каждого экземпляра класса). Можно и другие примеры привести когда надо у каждого экземпляра создавать свои собственные методы.

Цитата:

Сообщение от udaaff
Есть функции, а есть методы (экземпляра и статические). Не надо их спутывать между собой.

Если вы о посте 10, то там указано, что это аналогии. Тем более, что на самом деле нет никаких статических и прочих методов, а есть обычные функции с разными объектами активации.

Метод в конструкторе класса - это создании функции в самом объекте-экземпляре "класса".
А метод "наследуемый" - это просто метод в прототипе "класса", т.е. создание функции только в объекте прототипа и использование ссылок на нее. А то, что в AS2 статический метод - это в AS1 простое присваивание функции-классу своих свойств и методов.

iNils 02.03.2008 19:43

Цитата:

Сообщение от chingachgoog
Все зависит от того, как в классе прописан метод (см. выше).
...
метод записан в самом конструкторе...

Не знаю как вы, а я не создаю методы внутри методов/конструкторов.
Цитата:

Сообщение от chingachgoog
...и у метода есть собственное свойство (тогда это свойство будет уникальным у каждого экземпляра класса).

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

chingachgoog 02.03.2008 23:54

Код:

function Class1(){
        function f_class1(){}
        f_class1.prop=123
        this.metod1=f_class1
}

obj1=new Class1()
obj2=new Class1()

trace(obj1.metod1.prop)
trace(obj2.metod1.prop)

obj1.metod1.prop=321

trace(obj1.metod1.prop)
trace(obj2.metod1.prop)


iNils 03.03.2008 01:35

И какой смысл писать не правильно?

etc 03.03.2008 02:02

Цитата:

Сообщение от iNils
И какой смысл писать не правильно?

Никакого, конечно. Равно как и писать AS2-код в подобном виде.

chingachgoog 03.03.2008 13:43

Не понял про "писать неправильно" и про "AS2-код".

Пост 15 показывает:
1) в классе запросто может быть функция (метод) которая будет скопирована в каждый экземпляр класса
2) функция (метод) именно скопирован в экземпляр класса, т.е. их много, а не одна в прототипе класса.
3) у метода (функции) могут быть свои свойства.

iNils 03.03.2008 14:10

Я знаю только один случай когда нужно определить функцию внтури метода, это в классе Delegate.
Во всех остальных нужно писать правильно, а черт знает что.

etc 03.03.2008 14:10

Пост #15 показывает, как делать не надо.

chingachgoog 03.03.2008 14:28

Цитата:

Сообщение от iNils
Я знаю только один случай когда нужно определить функцию внтури метода, это в классе Delegate.
Во всех остальных нужно писать правильно, а черт знает что.

Все же я думаю, что "писать правильно" и "я знаю лишь один случай" - это разные вещи. Я не собираюсь искать примеры, когда НУЖНО задавать функцию в конструкторе класса, а не в его прототипе - программирование настолько многообразно, что вероятность такой нужды равна 100%. Я лишь изначально показал, что можно обойтись вообще без классов, а классы - не панацея.

Цитата:

Сообщение от __etc
Пост #15 показывает, как делать не надо.

Не понятно. Можете, пояснить?

iNils 03.03.2008 14:36

Цитата:

Сообщение от chingachgoog
Я лишь изначально показал, что можно обойтись вообще без классов

Назад к AS1?

chingachgoog 03.03.2008 14:42

Я бы не назвал AS1 - как движение назад. Другое дело его маркетологически пытаются так представить.

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

Mr. Fixit 03.03.2008 14:50

а если продукт в будущем надобно доработать?
Переписывать в класс?

iNils 03.03.2008 14:53

Да дело то не в классах, а в том, что chingachgoog определяет функцию в функции и считает, что это нормально и все это делают.

chingachgoog 03.03.2008 14:55

Это должен решать сам флеш разработчик исходя из своего опыта.
Если вы не работаете над продуктом где трудятся одновременно более 2-х программистов, то очень много моментов где быстро и легко обходиться без классов.

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

iNils 03.03.2008 15:00

В 15 посту вы написали чушь, причем тут маркетологи?

chingachgoog 03.03.2008 15:04

Цитата:

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

Отчего же?
Я как раз в посте 8 показал, что считаю нормальным, а пост 15 лишь пример, что классы сами по себе не панацея от расхода памяти.

add:
Цитата:

Сообщение от iNils
В 15 посту вы написали чушь, причем тут маркетологи?

При том, что в AVM2 я лишен возможности нормально пользоваться AS1.
А единственная существенная причина перехода на AVM2 заключается в новых методах, которых не было (не были доступны) в AVM1.
Вы не видите тут маркетологического хода?

iNils 03.03.2008 15:11

А причем тут AVM2, когда этот раздел AS1/AS2?

etc 03.03.2008 15:14

Цитата:

Сообщение от chingachgoog
Не понятно. Можете, пояснить?

Что непонятного? Создание какой-то левой нетипизированной функции внутри метода (конструктора), да ещё присвоение подобному нетипизированному объекту каких-либо свойтсв, которых в нем нет — это вы считаете нормальным?

А в AVM2 вы вообще не можете пользоваться AS1. Если под AS1 вы подразумеваете писанину в кадрах (не версию языка), то эта самая писанина оставлена на откуп дизайнерам, которые знают только stop() и gotoAndPlay(). Нормальный разрабочик писать в кадрах код не будет.

chingachgoog 03.03.2008 15:15

Цитата:

Сообщение от iNils
А причем тут AVM2, когда этот раздел AS1/AS2?

А что вы тогда понимали под движением вперед, если движение назад - это AS1? Неужто AS2 на той же самой AVM1?

Цитата:

Сообщение от __etc
Что непонятного? Создание какой-то левой нетипизированной функции внутри метода (конструктора), да ещё присвоение подобному нетипизированному объекту каких-либо свойтсв, которых в нем нет — это вы считаете нормальным?

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

etc 03.03.2008 15:18

Цитата:

Сообщение от chingachgoog
Неужто AS2 на той же самой AVM1?

Представьте себе. AVM2 = AS3.

iNils 03.03.2008 15:20

Припыли.
AVM1 - это AS1/AS2
AVM2 - это AS3
В AS1 писали классы на прототипах, а AS2 это обертка над AS1, которая взяла на себя рутинную работу и основное отличие AS2 от AS1 это не типизация, и не поставленные при публикации AS2, а код во внешнем файле который начинается с class {}. Но методы у них абсолютно идентичные.

etc 03.03.2008 15:27

Цитата:

Сообщение от chingachgoog
Если нетипизированная - это еще не значит левая.
Если вы так же не можете подобрать пример, когда это нужно, это еще не значит, что это не нормально.

Что нужно? Ваша писанина — не нужна. Помимо сложностей взаимодействия с локальной функцией подобного плана, она ещё жрет память и никак под ООП не тянет. А уж прицеплять свойства к подобной функции было модно в пятом флеше, для реализации псевдо-классов, которые тоже остались в AS2, но там это убожество хотя бы было убрано на уровень компилятора.

chingachgoog 03.03.2008 15:30

Цитата:

Сообщение от __etc
А в AVM2 вы вообще не можете пользоваться AS1.

Думаю вы поняли о чем я.

Цитата:

Сообщение от __etc
Если под AS1 вы подразумеваете писанину в кадрах (не версию языка), то эта самая писанина оставлена на откуп дизайнерам, которые знают только stop() и gotoAndPlay(). Нормальный разрабочик писать в кадрах код не будет

Нормальный разработчик сам решает где, когда и что он должен писать.
Теперь действительно, полноценный код в AVM2 не напишешь В СТИЛЕ AS1. Например, без создания классов.

Цитата:

Сообщение от __etc
Представьте себе. AVM2 = AS3.

Цитата:

Сообщение от iNils
Припыли.
AVM1 - это AS1/AS2
AVM2 - это AS3
В AS1 писали классы на прототипах, а AS2 это обертка над AS1, которая взяла на себя рутинную работу и основное отличие AS2 от AS1 это не типизация, и не поставленные при публикации AS2, а код во внешнем файле который начинается с class {}. Но методы у них абсолютно идентичные.

И я РОВНО о том же.
Так что же для вас, iNils является движением вперед, если вы не об AVM2 (=AS3), если AS2 - это лишь обертка под AS1?

add:
Цитата:

Сообщение от __etc
Что нужно? Ваша писанина — не нужна. Помимо сложностей взаимодействия с локальной функцией подобного плана, она ещё жрет память и никак под ООП не тянет.

Именно, то что такой код жрет память я и показывал. :)
Сложности взаимодействия тут нет - это быстрая иллюстрация класса, хотите напишите его в стиле AS2 по всем правилам и с типизацией. Дело не в этом было - прочитайте с начала. А как раз в том, что вовсе не обязательно всегда "тянуть на ООП", когда можно проще и быстрей сделать.

Цитата:

Сообщение от __etc
А уж прицеплять свойства к подобной функции было модно в пятом флеше, для реализации псевдо-классов, которые тоже остались в AS2, но там это убожество хотя бы было убрано на уровень компилятора.

Свойство к функции прицеплено, чтобы показать, что работает имеено копия функции, а не ее ссылка на прототип. Но если ПОДУМАТЬ, то вполне можно придумать для чего можно такое свойство использовать.

iNils 03.03.2008 16:04

Цитата:

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

Так что же для вас, iNils является движением вперед, если вы не об AVM2 (=AS3), если AS2 - это лишь обертка под AS1?
Для меня движение вперед, это переход на AS3, а не "об AVM2 (=AS3)" это ограничение раздела, а не мое.
Цитата:

Сложности взаимодействия тут нет - это быстрая иллюстрация класса, хотите напишите его в стиле AS2 по всем правилам и с типизацией.
Какого класса? Ваш код должен тогда выглядить так
Код:

function A () {
        this.A;
}
A.prototype.val = 123;
A.prototype.test = function () {
        this.val = 456;
};
///
obj1 = new A ();
obj2 = new A ();
trace (obj1.val);
trace (obj2.val);
obj1.test ();
trace (obj1.val);
trace (obj2.val);

Выходит вы вообще не понимаете, что такое класс.
Цитата:

Но если ПОДУМАТЬ, то вполне можно придумать для чего можно такое свойство использовать.
Если ПОДУМАТЬ, то можно сделать по другому и правильно

chingachgoog 03.03.2008 16:42

Цитата:

Сообщение от iNils
Нормальный разработчик думает о возможных изменениях.

Разумеется. И не вижу тут преграды для кода в кадрах. А собственно для любителей открывать еще один файл и в AS1 можно сохранять код вовне.

Цитата:

Сообщение от iNils
Для меня движение вперед, это переход на AS3, а не "об AVM2 (=AS3)" это ограничение раздела, а не мое.

Ну значит я правильно понял о чем вы говорите (об AVM2 и AS3), именно поэтому я и сказал о маркетинге с AVM2. Только почему-то вы сделали мне замечание по поводу раздела.

Цитата:

Сообщение от iNils
Какого класса? Ваш код должен тогда выглядить так
Код:

function A () {
        this.A;
}
A.prototype.val = 123;
A.prototype.test = function () {
        this.val = 456;
};
///
obj1 = new A ();
obj2 = new A ();
trace (obj1.val);
trace (obj2.val);
obj1.test ();
trace (obj1.val);
trace (obj2.val);

Выходит вы вообще не понимаете, что такое класс.

Не горячитесь.
Я с самого начала, с поста 8 сказал где разница:
1) можно заносить функцию в прототип класса, и тогда будет как в вашем коде, экономия памяти и по сути одна копия функции (в прототипе)
2) можно заносит функцию в конструкторе класса (это мой код из поста 15). Память жрется и создается копия функции для каждого объекта. Свойство prop лишь показывает, что это именно копия функции, а не ссылка на нее в прототипе класса. Я хотел понятнее код изложить, но можно и так:

Код:

function Class1(){
        this.f_class1=function(){}
        this.f_class1.prop=123
}

obj1=new Class1()
obj2=new Class1()

trace(obj1.f_class1.prop)
trace(obj2.f_class1.prop)

obj1.f_class1.prop=321

trace(obj1.f_class1.prop)
trace(obj2.f_class1.prop)

Это такой же "класс" как и "классы" AS2. Если я в примере не записал какие-либо свойства и методы в прототип, то это не значит, что это не "класс".

Цитата:

Сообщение от iNils
Если ПОДУМАТЬ, то можно сделать по другому и правильно

Что значит правильно?
Разве у 1000 программистов решающих одну задачу будет одинаковый код?

iNils 03.03.2008 16:51

Цитата:

Сообщение от chingachgoog
можно заносит функцию в конструкторе класса (это мой код из поста 15). Память жрется и создается копия функции для каждого объекта. Свойство prop лишь показывает, что это именно копия

А еще можно молотком по пальцам бить вместо гвоздя. И с пеной у рта доказывать, что забивающий сам решит, что ему нужнее и даже найти этому применение. Только вот все равно этог будет выглядить глупо.

Для меня данный разговор подошел к концу.


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

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