Связывание FLA-файлов в ActionScript с использованием классов документов

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

Я надеюсь исправить это сейчас, когда я работаю над большим проектом.

Исходя из того, что я прочитал, лучше объединить несколько файлов.fla, каждый со своим собственным классом документов. Это верно?

Если так, как мне загрузить один.fla с его классом документа и затем связать его с последующим файлом.fla (вместо использования сцен)? Или я неправильно понимаю, что было рекомендовано?

Спасибо!

1 ответ

Решение

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

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

Обычная альтернатива AS3 работе со сценами - создание / уничтожение экземпляров контента и использование основного класса документа в качестве их менеджера. Вы проектируете контент в библиотеке и создаете для них классы поведения AS3. Допустим, у вас есть два класса контента A и B. При запуске менеджер должен показать один из них и дождаться появления сигнала следующего:

private var APage:A;
private var BPage:B;

gotoA();

function gotoA():void
{
    if (BPage)
    {
        BPage.destroy();
        removeChild(BPage);
        BPage.removeEventListener(Event.CLOSE, gotoA);
    }

    APage = new A;
    APage.addEventListener(Event.CLOSE, gotoB);
    addChild(APage);
}

function gotoB():void
{
    if (APage)
    {
        APage.destroy();
        removeChild(APage);
        APage.removeEventListener(Event.CLOSE, gotoB);
    }

    BPage = new B;
    BPage.addEventListener(Event.CLOSE, gotoA);
    addChild(BPage);
}

Таким образом, и A, и B должны иметь соответствующие методы.destroy(), которые освобождают используемые ресурсы, отписывают методы от событий, удаляют экранные объекты и т. Д., И они оба должны запускать Event.CLOSE, когда они будут выполнены.

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

package
{
    import flash.display.Sprite;

    class BasicPage extends Sprite
    {
        // A reference to the page manager instance.
        public var Manager:PageManager;

        public function destroy():void
        {
            while (numChildren > 0) removeChildAt(0);

            Manager = null;
        }

        // Subclasses will have an access to this method to tell manager to show another page.
        protected function showOtherPage(pageClass:Class):void
        {
            Manager.showPage(pageClass);
        }

        // A method that is called by manager when everything is ready.
        // If page should take any actions on start it is a good idea to override this method.
        public function startEngine():void
        {
        }
    }
}

Тогда пример страницы А:

package
{
    import flash.events.MouseEvent;

    public class A extends BasicPage
    {
        // Lets say, class A in library have a designed button named Click.
        public var Click:SimpleButton;

        // We have things to undo here.
        override public function destroy():void
        {
            Click.removeEventListener(MouseEvent.CLICK, onClick);
            Click = null;

            // Pass the destruction to superclass so it wraps its existence either.
            super.destroy();
        }

        override public function startEngine():void
        {
            Click.addEventListener(MouseEvent.CLICK, onClick);
        }

        private function onClick(e:MouseEvent):void
        {
            // Lets use inherited method to show other page.
            showOtherPage(B);
        }
    }
}

Итак, PageManager будет выглядеть так:

package
{
    public class PageManager extends Sprite
    {
        private var Page:BasicPage;

        // constructor
        function PageManager()
        {
            super();
            showPage(A);
        }

        function showPage(pageClass:Class):void
        {
            if (Page)
            {
                Page.destroy();
                removeChild(Page);
                Page = null;
            }

            Page = new pageClass;
            Page.Manager = this;

            addChild(Page);
            Page.startEngine();
        }
    }
}

Поначалу все это может выглядеть страшно, но на самом деле это не так. PageManager всегда будет иметь текущую страницу, если потребуется показать другую страницу, текущая будет регулярно уничтожаться. Каждый класс страницы будет стремиться к своему собственному контенту, что упрощает кодирование, поскольку вам не нужно видеть всю картинку. Если вам нужны какие-либо постоянные данные, сохраните их в PageManager, чтобы каждая страница имела доступ к данным без необходимости взаимодействия этих страниц друг с другом.

Другие вопросы по тегам