Как избежать беспорядочного кода AS3 - PullRequest
9 голосов
/ 09 июня 2011

Я некоторое время программировал на ActionScript 3 и заметил, что естественное развитие моего кода, похоже, принимает форму одного гигантского класса документов с десятками переменных-членов, обратных вызовов и дескрипторов объектов на Уровень. Короче: это какая-то путаница!

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

Итак, мне интересно ... Какие есть хорошие способы помочь убрать этот безумный код? Или это нормально? Я родом из C ++, и мне нравится писать объектно-ориентированные вещи, но я не вижу способа перенести такую ​​структуру во Flash. Любое понимание будет очень признателен.

Спасибо

Ответы [ 6 ]

9 голосов
/ 09 июня 2011

Вы можете применить многие свои навыки C ++ к своему проекту AS3.

Есть много хитростей.Рад, что ты поднял код на основной временной шкале.Вместо того, чтобы помещать код на временную шкалу (это слишком часто встречается в программах AS2, а с AS3 вы можете полностью избежать этого), я бы рекомендовал рассматривать каждый объект как отдельный класс.Например, ваш мувиклип, к которому вы применяете код для мыши, может быть объектом, созданным в своем собственном классе.Скажем, MovieClip - это изображение шара.Вы должны создать класс Ball, который расширяет (наследует) класс MovieClip и обрабатывает в нем событие щелчка мышью:

package 
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;

    public class myObjects.Ball extends MovieClip 
    {
        public function Ball ()
        {
            this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
        }

        private function mouseDownHandler(event:MouseEvent):void
        {
            // Code
        }
    }
}

Затем найдите MovieClip шара на панели «Библиотека», щелкните его правой кнопкой мыши., Свойства, переключиться в расширенный режим, отключите экспорт для AS.Теперь обратите внимание, как ваш MovieClip уже ссылается на класс MovieClip в качестве базового класса?Вам это больше не понадобится, поскольку ваш класс Ball расширяет класс MovieClip .. поэтому в поле Class напишите «myObjects.Ball» и очистите поле «Base».Вы должны увидеть зеленую галочку, если вы написали путь к своему классу Ball с пространством имен, который может найти Flash IDE.

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

Расширение класса, который я объяснил, является версией AS3 «Наследование» (класс Ball наследует класс MovieClip).Вы также можете использовать другие ОО-концепции, такие как полиморфизм и инкапсуляция.Вы должны по возможности инкапсулировать свой код в отдельные классы.Скажем, если в вашем проекте было несколько типов MovieClips для мяча, и вы хотите, чтобы класс Ball был родительским классом для Футбольного мяча, Бильярдного шара и Бейсбола.Каждый из этих дочерних классов может расширять класс Ball.Еще одна вещь, которую я нашел полезной для больших проектов, - это создание статического класса для обработки всех событий моего приложения.Поскольку я определяю его как public static class, я могу импортировать его в каждый из моих классов, и его переменные создаются только один раз на время работы приложения.Это может быть чрезвычайно полезно.

Я также создал свой собственный псевдодеструктор в классах, чтобы работать с AS3 больше похожим на c ++.Самый простой способ сделать это - вызвать псевдодеструктор, прежде чем уничтожить экземпляр объекта.Я сделал это автоматически в одном приложении, поэтому, если это кого-то интересует, я могу отследить код ... но AS3 обрабатывает сборку мусора за кулисами, и обычно деструктор не нужен, но, может быть, я просто думаю, что он не нужен, потому чтоЯ слишком долго вырабатывал вредные привычки в программировании на AS3.

Лично я думаю, что чем больше вы стремитесь разрабатывать приложения в AS3, как если бы вы разрабатывали на C ++, тем больше это доставляло удовольствия и тем больше возможностей для повторного использования.код становится.Продолжайте в том же духе ... скоро вместо беспорядочного кода у вас будет куча файлов ActionScript. LOL ... немного обоюдоострого меча, но ничего.

2 голосов
/ 09 июня 2011

Во-первых, если это действительно не нужно или вы не можете делать с кодом, не используйте временную шкалу и элементы на сцене. У меня есть только 1 слой с 1 кадром и ничего на сцене. Но у меня есть все графические элементы, которые мне нужны в библиотеке, связанной с классами. Если я не очень много делаю с этими элементами, я оставляю их базовые классы как есть (большую часть времени - мувиклип), но если я планирую с ними что-то манипулировать, я связываю их с пользовательским классом.

Я также организую свою папку lib в соответствии с их потребностями. Пример:

lib
  -> gui
    ->Controls.as (Controls class)
    -> etc..
  -> elements
    -> Ball.as (Ball class for controling bal element)
    -> Hammer.as (Class for controling hammer)
    -> etc..
  -> animation
    ->Tween.as (custom tween class)
    ->etc..
  -> data
    -> XmlParser.as (class for getting data from xml)
    -> etc..

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

Кроме того, я пытаюсь отделить логическую часть от отображаемой части, а иногда и отдельную часть данных.

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

2 голосов
/ 09 июня 2011

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

Лично я бы все вместе угробил.Вот как я работаю:

Я создаю чистый проект ActionScript во Flash Builder.Я добавляю любые внешние библиотеки в папку lib .Я создаю fla во Flash Pro для своих активов.Этот FLO экспортирует SWC, который связан с моим проектом Flash Builder.

Вы также можете попробовать RobotLegs .Это крошечная инфраструктура MVC, которая поможет вам подключить ваше приложение.

1 голос
/ 09 июня 2011

Проверьте Ножки робота - это отличная среда MVC, которая действительно помогла мне написать более чистый (и менее!) Код, чем обычно.

Я бы также предложил библиотеку Signals Роберта Пеннера по трем причинам: 1) она позволяет писать меньше кода; 2) классы больше не нуждаются в расширении EventDispatcher; 3) я чертовски люблю это!

Не могу не подчеркнуть, что достаточно использовать MVC-фреймворк - структура файлов / папок, которую он предоставляет для организации вашего кода, того стоит.

1 голос
/ 09 июня 2011

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

Essential ActionScript 3.0 http://www.amazon.com/Essential-ActionScript-3-0-Colin-Moock/dp/0596526946

Шаблоны проектирования ActionScript 3.0.http://www.amazon.com/ActionScript-3-0-Design-Patterns-Programming/dp/0596528469

С вашим фоном ООП это идеально.

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

Вы будете тратить время на MVC или любой другой шаблон проектирования, не имея возможности надежно кодировать ООП в AS3.

1 голос
/ 09 июня 2011

Используйте MVC framework.Некоторые находят их ограничивающими, но каждый раз, когда я не использую один для «простого» проекта, масштабы растут, и я ужасаюсь от того, какое плохое решение я принял.

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

Хорошая структура также позволяет повторно использовать вещи в других проектах.

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

Я использую PureMVC , но любой из популярных должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...