Форум 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)
-   -   класс, унаследованный от MovieClip без библиотеки (http://www.flasher.ru/forum/showthread.php?t=113927)

Lecosson 14.07.2008 03:50

класс, унаследованный от MovieClip без библиотеки
 
Помогите с решением задачи. Перерыл форум, но решения не нашел.
Задача - сделать класс со следующими свойствами:

создание экземпляра:
Код:

myObj = new MyClipClass(data1, data2, ...);
(при этом конструктор создает мувиклип и что-то в нем рисует средствами наподобие lineTo)

свойства (поведение) как у мувиклипа. Например, если у объекта есть поле-мувиклип, то:

Код:

myObj._xscale *= 2;
должно масштабировать сам объект и дочерний мувик.

Такое вообще реализуемо средствами AS2? Я уже двое суток рыскаю по Сети и по форуму, в частности, но решения нигде не нашел.

MrPoma 14.07.2008 03:55

Код:

class MyMovieClip extends MovieClip {

        function MyMovieClip(){

        };
       
        public static function create(parent:MovieClip, name:String, depth:Number, init:Object):MyMovieClip {
                var mc:MovieClip = parent.createEmptyMovieClip(name, depth);
                var constructor:Function = MyMovieClip;
                mc.__proto__ = constructor.prototype;

                for(var item:String in init){
                        mc[item] = init[item];
                };
                constructor.call(mc);
                return MyMovieClip(mc);
        };
};

Юзать:
Код:

var myMc:MyMovieClip = MyMovieClip.create(this, 'mc', 0, {_x:100, _y:100});

wvxvw 14.07.2008 03:59

АС2 - нет, АС3 - да.
Можно инкапсулировать создание клипа так, что createEmptyMovieClip() не будет торчать наружу, и создание будет выглядеть так, как вы хотите, но фактически вы все равно будете вызывать createEmptyMovieClip, просто снаружи это не будет заметно.
Во флеше есть реализация этого, называется UIObject

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

mrProma:
Код:

constructor.call(mc);
это в чем такое можно скомпилировать? ваащета call и apply не применимы к конструктору...

Lecosson 14.07.2008 04:16

Спасибо за ответы, но такое решение я уже находил, и напомню, чего именно хочется добиться:
создание экземпляра: myObj = new MyClipClass(data1, data2, ...);
при этом конструктор создает мувиклип и что-то в нем рисует программными средствами LineTo, etc.
Разумеется, createEmptyMovieClip где-то будет присутствовать. Задача именно в том, чтобы после new нормально отрабатывал конструктор без вызова дополнительных методов (create) из программы. Все нужно спрятать в классе.
В принципе, никаких проблем, но хочется потом иметь не это:
Код:

myObj.clip1._x += 50;
myObj.clip2._x += 50;

а вот это:
Код:

myObj._x += 50;

etc 14.07.2008 10:50

Цитата:

Сообщение от wvxvw (Сообщение 751913)
это в чем такое можно скомпилировать? ваащета call и apply не применимы к конструктору...

Применимы, особенно, если он указан как Function.

chingachgoog 14.07.2008 13:10

Цитата:

Сообщение от Lecosson (Сообщение 751915)
хочется потом иметь не это:
Код:

myObj.clip1._x += 50;
myObj.clip2._x += 50;

а вот это:
Код:

myObj._x += 50;

По сути тут несколько проблем:
1) Как отловить ОПРЕДЕЛЕНИЕ нового свойства? (типа мое_свойство="параметры")
Видимо, что без циклической проверки свойств объекта - никак :(
2) можно отловить конструкцию мое_свойство+="параметр" с помощью __resolve (тут поймается момент когда мое_свойство изначально не определено), но где гарантии, что не воспользуются синтаксисом из п.1?
Да и толку мало, т.к. свойство надо будет как-то транслировать на мувик
3) очень неплохо (любой метод!) можно сделать с помощью __resolve обработчика функции, но тогда придется вызывать нестандартно: типа мое_свойство("параметр"), вместо мое_свойство+="параметр" - как сделать описано в хелпе.
4) Самый правильный и самый нудный вариант - добавить геттер/сеттер обработчики к объекту (addProperty или set/get).

wvxvw 14.07.2008 14:50

__etc:
фз... у мну компилятор упорно не соглашается назвать переменную конструктором =) говорит, что не стоит такое имя использовать =)
Lecosson:
Ну, а если эту переменную назвать как-нибудь по-другому, то пример MrProma вполне рабочий, и делает то, что вам надо.

Если так уж позарез не хочется вызывать статический create:
Ну, видится такой вариант реализации:
Вы не создаете в вашем приложении других клипов, а только наследники такого класса + создаете класс-копозит, у которого будут методы addChild() и removeChild(), тогда эти методы смогут добавить на сцены хоть строку, а не только экземпляр какого-нибудь класса =)
* т.е. ссвоего рода договоренность: если я передаю ClipContainer.addChild([class Clip]) то он создает пустой клип в своем .parent и передает Clip в его .thisClip ссылку на вновь созданый клип. Единственное, что подменить ссылки из других мест на этото только что созданый клип все равно не получится, так что Clip будет должен транслировать все мувиклипные свойства через свои свойства тому клипу, который ClipContainer создал.
Но опять же, это куча соглашений с самим собой, и не надежно, потому что как только вы захотите использовать какие-то классы не из вашего проекта - вся эта схема может порушиться. + куча дополнительных методов, просто ради красивостей.

Alex_beginner 14.07.2008 16:06

Господа! Может быть кто-нибудь приведет готовый код полноценного подкласса MovieClip, экземпляр которого создается не через статический метод create, а через использование оператора new - тема довольно актуальная, на мой взгляд.
Я понимаю, что в оффициальной литературе указывают на то, что создать такой подкласс без связывания его с символом невозможно, вернее возможно, но это будет не полноценный визуальный подкласс.

iNils 14.07.2008 17:06

В ас2 создание мувиклипа через статичным метод, является единственно верным решением. Причина в том, что создав внутри конструктора мувиклип, его нельзя связать с this.

Alex_beginner 14.07.2008 17:18

Цитата:

В ас2 создание мувиклипа через статичным метод, является единственно верным решением.
Хорошо. А как дело обстоит с АС1? Может быть есть обходные пути?


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

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