Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Flash Builder, swc-библиотеки и... прелоадер одним файлом (http://www.flasher.ru/forum/showthread.php?t=205243)

Nucer 26.11.2013 11:04

Flash Builder, swc-библиотеки и... прелоадер одним файлом
 
Всем привет! Впервые возникла необходимость сделать прелоадер одним файлом на AS3 - ибо нерадивые игровые порталы принимают игрушку одной swf-кой...((
Ситуация такая:
Есть несколько fla-шек с кучей графики и экспортируемых классов, которые эту графику и используют. Как обычно - компилю их в swc, а swc-библиотеки подцепляются в проект во Flash Builder'е. Многие классы, написанные в билдере расширяют классы из swc. Например:
Код AS3:

class MyButton extends MyButtonGraphicFromSwc

Внешний прелоадер, естественно, работает на ура.
Поковырялся чуток, убрал всем ресурсам галочку "Export in frame 1" - теперь билдер ругается кучей ошибок типа того:
Код:

1017: The definition of base class **** was not found
1046: Type was not found or was not a compile-time constant: ****.
1180: Call to a possibly undefined method ****.

в тех местах, где были использованы классы из swc...

Подскажите по существу плиз)) Все найденные мной мануалы по "созданию прелоадера одним файлом" начинаются исключительно с танцев с бубном во FlashIDE и манипуляциях с кадрами...
Реально ли сделать этот прелоадер в билдере??
Можно ли сделать какой то костыль в виде fla-шки, которая будет реализовывать всю эту историю с кадрами и при этом будет инстанциировать класс игры, созданный в билдере?))
Спасибо, если кто подскажет решение :))

alexandrratush 26.11.2013 11:36

А так пробовали делать?

Document Class
Код AS3:

package {
 
  import flash.display.Sprite;
 
  [Frame(factoryClass='Preloader')] //Название класса прелоадера
 
  public class Main extends Sprite {
 
    public function Main() {
        //init
    }
  }
}

Preloader Class:
Код AS3:

package {
 
  import flash.display.DisplayObject;
  import flash.display.MovieClip;
  import flash.events.ProgressEvent;
  import flash.utils.getDefinitionByName;
 
  public class Preloader extends MovieClip {
 
    public function Preloader()
    {
        //графика
 
        this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
    }
 
    private function onProgress(e:ProgressEvent):void
    {
        var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
        if (percent == 100)
        {
          this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
          onLoaded();
        }
    }
    private function onLoaded():void
    {
      nextFrame(); //на следующий кадр
      var App:Class = getDefinitionByName("Main") as Class; //Название Document Class
      addChild(new App() as DisplayObject);
    }
  }
}


Nucer 28.11.2013 10:19

Не помогает(Всё та же ошибка с классами, расширяющими базовые классы, которые лежат в swc-либах((
1017: The definition of base class *** was not found.
где *** - базовый класс из swc (мувиклипы с определённой графикой внутри)

Добавлено через 32 часа 8 минут
Хм... Долго танцевал с бубном, во флэше поставил export classes in frame 2, а всем мувикам из библиотеки поставил галку Export in frame 2.
Теперь классы исправно подхватываются, но вот толку ноль - всё загружается также, как и загружалось)

Попробовал сделать с директивой [Frame, но теперь прямые ссылки на мой класс отсутствуют и, как следствие, он не включается в экспортируемыую флэшку и getDefinitionByName выдаёт соотв. ошибку, что класс не найден! Как заставить FlashBuilder 4.6 заинклудить класс, при этом сделать это "во 2й фрейм" - никак??

Сделал костыль во Flash CS6 - два кадра, на первый поставил добавление прелоадера на сцену, на 2й - создание класса игры. Работает исправно. Но загружается, собака, целиком на 100%, потом только отображается (согласно bandwith profiler'у - загружено 0 кадров до момента загрузки на 100%). Видимо для классов, экспортированных в swc не работает настройка export in frame n??

В общем ситуация тупиковая по всей видимости...

gadzhimari 29.11.2013 20:00

Nucer, эта тема обсуждалась здесь. Действительно мета-тег Frame не работает. Как решение можно использовать ключ компилятора называемый frame.
Т.е. тебе нужно просто вписать в FB окно Project - Properties - ActionScript Compiler в поле Additional compiler arguments строчку -frame two Main, где Main имя класса, который будет создан после загрузки прелоадера. Подробно про ключ frame написано здесь и здесь. Класс Preloader и связанный с ним класс Main должны находится в корне проекта. Иначе выходит ошибка.

Nucer 01.12.2013 12:43

Получилось!!! Спасибо огромное :)))


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

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