PDA

Просмотр полной версии : Мувиклип: код таймлайна vs код класса


Fogflasher
08.04.2013, 10:56
Хотелось задать несколько нуб-вопросов общего плана.

1. Каковы отличия кода мувиклипа, находящегося внутри его таймлайна, от кода, который находится в классе этого мувиклипа? (получаемого по Properties > Export for Action Script, насколько я понимаю, других способов создания класса мувиклипа нет). Я конешно подозреваю, что второй путь более правильный, но почему это так обьяснить не смогу.

2. Нужно ли стремится к тому, чтобы код таймлайна мувиклипа был вообще пустым, а код всегда находился в коде класса? И если да, то что это дает, кроме "мой код выглядит профессионально, я крутой". Может ли быть так, что на практике оптимальнее всего использовать связку "код класса" + "код таймлайна".

3. Является ли код класса мувиклипа таким же глобальным как и код класса DocumentClass всего флэш-проекта?
Является ли такой код просто "удобным размещением в отдельном месте" (то есть он с таким же успехом мог бы находится и в DocumentClass.)

4. Предположим, есть два мувиклипа, и один вложен в другой.
И у каждого есть свой код класса. Являются ли такие коды одинаково публичными для всего преложения, или код вложенного мувиклипа, как бы "более локален", и обращение к нему должно быть специфическим.

Александр Мостовой
08.04.2013, 11:20
1. Каковы отличия кода мувиклипа, находящегося внутри его таймлайна, от кода, который находится в классе этого мувиклипа? (получаемого по Properties > Export for Action Script, насколько я понимаю, других способов создания класса мувиклипа нет). Я конешно подозреваю, что второй путь более правильный, но почему это так обьяснить не смогу.

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

2 Может ли быть так, что на практике оптимальнее всего использовать связку "код класса" + "код таймлайна". Как сказал выше, если вы используете код на фрейме, флеш создаст виртуальный класс, т.е. вы не сможет сделать это одновременно. Когда весь код в классах навигация по коду в 20 раз легче. В большинстве случев и tween ради которых во многом и пишется код во фреймах проще заменить програмной анимацие.
В тоже время в самом IDE удобно расставлять элементы, особенно для случая с играми. Вот здесь как раз имеет большой смысл использовать графику на сцене.

3. Является ли код класса мувиклипа таким же глобальным как и код класса DocumentClass всего флэш-проекта?
Является ли такой код просто "удобным размещением в отдельном месте" (то есть он с таким же успехом мог бы находится и в DocumentClass.)
Глобальных методов в AS3 практически нет, как уже отписал в другой теме. DocumentClass и класс мувиклипа равнозначны за исключением что один создал другой. Доступ отовсюду ко всему - это недостаток, а не преимущество. ПРеимущество инкапсуляции (термин обозначающий ограничение области видимости) в том что открывая код класса в не решаете исполинские задачи, а отслеживаете только ту логику которая находится в этом классе

4. Предположим, есть два мувиклипа, и у каждого есть код класса.
Являются ли такие коды одинаково публичными для всего преложения, или код вложенного мувиклипа, как бы "более локален", и обращение к нему должно быть специфическим.
Вам следует отказаться от восприятия классов как предтсавление в DisplayObject , хотя безусловно некоторая иерархия имеется. public доступен одинаково везде, но вот устанавливать метод в паблик без необходимости как раз не следует. А вот на счет иерархии, как раз следует организовывать доступ к мелки объектом через более крупного управителя. Можете почитать об этом подробнеепо клбчевым словам "шаблоны проектирования" или "паттерны порграммирования"


PS: Для того что бы понять преимущества кода в классах вам нужно просто попробовать поиспользовать какой-нибдуь другой редаткрор кода кроме FlashIDE: FlashDevelop, FlashBuilder, IntellageIdea ...

Fogflasher
08.04.2013, 15:57
Спасибо, Александр.

Я, разумеется, еще не могу понять ваши ответы в полной мере, но зато теперь есть некоторые общие ориентиры.

Александр Мостовой
08.04.2013, 16:06
СЛовом при переходе с кода во фреймах на ООП чаще всего у людей появляется вопрос как получить доступ к экземплярам объектов.
И самое просто решение для начала в повесить MainClass статическое свойство ссылающееся на единственный экземпляр этого класса.

package
{
import flash.display.Sprite;

public class MainClass extends Sprite
{
public static var instance:MainClass;
public function MainClass ()
{
super();
instance = this;
trace (this);
};

}
}

В коде досту к нему из любого места можно получить вот так

var main:MainClass = MainClass.instance;

По сути это и есть недооформленый Синглетон. В дооформленных видах он код следит за тем что бы экземпляр этого класса создавался единственный раз, вместо публичной переменной используется геттер, но не буду приводить его что бы не путать. :)

strangedk
08.04.2013, 17:09
Александр: Это типа замена _root ? :)

Александр Мостовой
08.04.2013, 17:16
Александр: Это типа замена _root ?
ну да :)
Это просто для постепенного перехода пишущих код во фреймах на классы.
И этот способ как перестарховка от искущения вернуться на старую идеологию и начать писать вместе с root всякие parent.parent
И вообще отказаться от отождествления иерархии класов с иерархией вложенности DisplayObject :)

strangedk
08.04.2013, 17:21
Ну и в итоге, из любого класса, у них будет доступ к _root :)
И вместо того чтобы использовать событийную модель, или композицию, можно ведь обращаться напрямую, удобно)

Александр Мостовой
08.04.2013, 17:53
И вместо того чтобы использовать событийную модель, или композицию, можно ведь обращаться напрямую

Ну для начала можно, как минимум, заменить root клас с MovieClip на Sprite подальше от dynamic :)