PDA

Просмотр полной версии : Мувики-объекты - вопрос по шаблонам проектирования


ivenhoe
03.05.2007, 14:53
Многоуважаемые программисты!
Созрел вопрос. Флэшью балуюсь давно и не безрезультатно, но серьезных достижений не добился. Однако теперь вот потребовалось углубиться, в чем рассчитываю на минимальную, но квалифицированную помощь общественности.

Вопрос, так сказать, идеологический.

Мне известно, что напрямую наследоваться от MovieClip нельзя. Точнее, получится не клип, а что-то не работоспособное. Был какой-то способ (вроде через attachMovie), но я сейчас не вспомню... Собственно, вопрос в другом (хотя буду благодарен за напоминание ответа).

Имеется некий класс, имеющий отображение. Грубо говоря, например, класс "геометрическая фигура". Т.е. в библиотеку там помещать просто нечего, предполагается, что экземпляр будет отрисовываться динамически, в зависимости от конкретных свойств конкретного объекта.

Как удобнее всего в реализации поступить:

1. Все-таки поместить в библиотеку некоторый пустой клип, и attach его с неким классом
2. Класс и мувик - совершенно разные вещи, т.е. пользовательским кодом создается мувик, и объекту (допустим, через конструктор) передавать ссылку на этот мувик
3. Объект сам в конструкторе создает пустой мувик и рисует в нем что захочет

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

class MyMovie extends MovieClip
{
...
}


И, так сказать, еще один вопрос (из одной задачи просто).
У пустого клипа (созданного через createEmptyMovieClip) размеры нулевые. Как их не присваивай, они нулевыми и остаются, пока ничего не нарисуешь в нем. А нужно бы заранее знать заданные размеры.

Пример на основе той же задачи: пользовательский код создает объект класса "геометрическая фигура", и задает ее размеры. Объект, смотря на свои размеры, отрисовывает фигуру, чтобы в них вписаться, грубо говоря.

Можно, конечно, к мувику присобачить дополнительные аттрибуты типа mc.originalWidtр, но, возможно, существует более изящный и широкоиспользуемый способ?

ivenhoe
03.05.2007, 15:10
Хотя, пардон, по первой части в факе вроде нашел...
По второй части - вопрос еще актуален :-)

lowka
03.05.2007, 15:22
[удалено]

Создайте класс у которого будет ссылка на мувик, а у класса определите нужные свойства и работайте уже с ним.

ivenhoe
03.05.2007, 15:31
Ага, спасибо. Это именно тот метод, который я не смог припомнить. Но повторюсь, в библиотеку по сути помещать нечего, разве что для проформы - пустой мувик...
С другой стороны, не зря же люди изобретают собственные способы вроде http://flasher.ru/forum/showpost.php?p=528447&postcount=6

Tardos Mors
03.05.2007, 15:35
Мне известно, что напрямую наследоваться от MovieClip нельзя. Точнее, получится не клип, а что-то не работоспособное.
Вам не правильно известно. От MovieClip наследоваться можно, только нужно создать экземпляр этого символа в библиотеке и прописать ему класс.
Создавать экземпляры такого класса нельзя через new (так же как и MovieClip), а нужно использовать attachMovie.
У пустого клипа (созданного через createEmptyMovieClip) размеры нулевые. Как их не присваивай, они нулевыми и остаются, пока ничего не нарисуешь в нем. А нужно бы заранее знать заданные размеры.
А разеры чего задавать, если мувиклип пуст?

etc
03.05.2007, 16:16
var myClass:MyClass = MyClass(this.attachMovie(…));

ivenhoe
04.05.2007, 10:47
Вам не правильно известно. От MovieClip наследоваться можно, только нужно создать экземпляр этого символа в библиотеке и прописать ему класс.

Дело в том, что клип изначально абсолютно пустой. Помещать в библиотеку пустой символ? Как-то не очень... Впрочем, идея со статическим методом меня устроила (найдено в факе). Но любопытно, кто еще как делает.

Создавать экземпляры такого класса нельзя через new (так же как и MovieClip), а нужно использовать attachMovie.

А разеры чего задавать, если мувиклип пуст?
Грубо говоря, размеры "области рисования". К примеру, опять же, пользователь создает экземпляр класса "геометрическая фигура" и задает ему параметр - "рисовать треугольник". Затем устанавливает размеры области рисования, объект смотрит на свои размеры (заданные пользователем) и вписывается в них.

Tardos Mors
04.05.2007, 18:08
объект смотрит на свои размеры
Объект может посмотреть на любые переменные, не обязательно на _x и _y. До того, как фигура будет отрисована, размеры можно хранить где угодно.

ivenhoe
11.05.2007, 08:45
Гм... Я не совсем понял, как правильно-то...
Думал, что так:

class MyClass extends MovieClip
{
function MyClass(par1, par2) {...}
...
}

// В библиотеке есть символ MySmb
var mc:MyClass = new MyClass(1, 2);
_root.attachMovie("MySmb", "mysmb_instance", _root.getNextHighestDepth(), mc)

Однако

Создавать экземпляры такого класса нельзя через new (так же как и MovieClip), а нужно использовать attachMovie.

Собственно, как-нибудь-то я все таки создам и приаттачу... Однако хотелось бы чтобы логика конструктора выполнялась при этом. Делать дополнительный метод типа Init() конечно можно, но как-то неспортивно.

Если это не слишком затруднит общественность, не могла ли бы она привести пример псевдокода с attachMovie и конструктором класса?

Aziz Zaynutdinoff
11.05.2007, 09:32
class MyClass
{
function MyClass(myWidth:Number, myHeight:Number)
{
//рисуем в заданной вами ширине и высоте, зачем же использовать _width, _height? :)
}
}

ivenhoe
11.05.2007, 09:39
Ну как зачем... В рамках моей задачи размеры мувика могут (более того, должны) меняться в зависимости от некоторых факторов. Получается, что у пустого мувика нельзя задать размеры, а у непустого можно... :(
Вобщем, нелогично.


Впрочем, вопрос теперь уже в другом: как же блин вызвать конструктор моего класса-наследника от мувиклипа кроме как костылем типа Init()?

Aziz Zaynutdinoff
11.05.2007, 10:29
Получается, что у пустого мувика нельзя задать размеры, а у непустого можно...
Вобщем, нелогично.

и чем это нелогично? :)


Впрочем, вопрос теперь уже в другом: как же блин вызвать конструктор моего класса-наследника от мувиклипа кроме как костылем типа Init()?

А зачем наследоваться от MovieClip'а? Напишите просто класс и будет вам счастье.

ivenhoe
11.05.2007, 12:37
и чем это нелогично? :)

Как чем? Есть же метод getBounds(), который вроде бы как и возвращает размеры. А _width, _height можно установить. Но, оказывается, не всегда. Почему же тогда _x и _y можно установить в пустом клипе?
А зачем наследоваться от MovieClip'а? Напишите просто класс и будет вам счастье.
В какой-то момент я решил, что разумнее будет делать не обертку над клипом, а именно наследоваться от него.

Aziz Zaynutdinoff
11.05.2007, 13:21
Когда вы проставляете координаты, вы устанавливаете точку... а как, простите, пустоте задавать ширину и высоту? :)

В данном случае не разумнее наследоваться, потому что extends MovieClip можно использовать только для объекта в библиотеке с прописанным именем класса. Ну нет у MovieClip'а конструктора типа new

ivenhoe
11.05.2007, 13:26
Следуя логике: как можно установить координаты пустого места? :-))
Впрочем, мне наверно сложно привыкнуть к недоООП... В ООП-языках разумно было бы ожидать что-нибудь вроде ClipIsEmptyException....

lowka
11.05.2007, 13:51
Следуя логике: как можно установить координаты пустого места? :-))
Впрочем, мне наверно сложно привыкнуть к недоООП... В ООП-языках разумно было бы ожидать что-нибудь вроде ClipIsEmptyException....
и еще в ООП языках можно использовать наследование/композицию (в ас2 тоже) и создавать собственные классы, но вы делать этого не хотите и из-за этого мучаетесь с ветряными мельницами :boredom:

Aziz Zaynutdinoff
11.05.2007, 17:04
Следуя логике: как можно установить координаты пустого места? :-))

Следую логике, можно установить точку отсчёта... т.е. (0, 0) для только что созданного объекта :)