Проблема с опубликованным приложением Adobe Air - PullRequest
0 голосов
/ 02 апреля 2011

У меня есть приложение Air (Adobe Flash CS4, Adobe AIR 1.1, ActionScript 3.0).Я опубликовал его как файл * .air и установил на свой компьютер.Работало нормально.Но когда я попытался использовать его на другом компьютере, я обнаружил следующую проблему:

  1. Я установил AIR из http://get.adobe.com/ru/air/
  2. Я установил свой Main.air и запустил его.
  3. Он не может правильно проанализировать XML-файл (pattern.xml).

Код моего приложения следующий:

public class Main extends MovieClip  {              
    public function Main():void
    {
        this.stop();
        var file:File = File.applicationDirectory.resolvePath("pattern.xml");
        var fileStream = new FileStream();
        fileStream.open(file, FileMode.READ); 
        var str:String = fileStream.readUTFBytes(fileStream.bytesAvailable);
            str=str.substr(1);    
        var panoramaPattern=new XML(str);
        fileStream.close();
    }
}

Я пытался комментироватьнесколько команд в Main ().Итак, код работает без

var panoramaPattern=new XML(str);

Что не так с этой командой?pattern.xml был включен в «Включенные файлы».

Ответы [ 2 ]

1 голос
/ 02 апреля 2011

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

Каждый раз, когда у вас есть класс, который расширяет тип DisplayObject, вы ВСЕГДА должны создавать модифицированный конструктор, предназначенный для обнаружения элемента "stage", и, если он не существует, прослушивать событие ADDED_TO_STAGE,а затем выполнить инициализацию на основе экранного объекта в обратном вызове.Это связано с тем, что классы, основанные на отображаемых объектах, создаются наполовину.Конструктор вызывается сразу же, когда класс создается / создается, но свойства и методы этого класса, включая дочерние элементы, которые являются экранными объектами (как в этом случае кнопки и т. Д.), Недоступны до тех пор, пока класс не будет добавлен в глобальную ".stage "object.

В случае AIR ваш объект NativeWindow содержит единственный экземпляр" stage ", который наследуют все дочерние элементы этого NativeWindow.Поэтому, когда вы добавляете MovieClip или Sprite и т. Д. На сцену, свойство «stage» этого экранного объекта заполняется ссылкой на глобальный объект stage, содержащийся в NativeWindow.Поэтому всегда помните, что когда дело доходит до флэш, практика работы с конструкторами / инициализацией экранных объектов заключается в том, чтобы отложить все функциональные возможности до обратного вызова, который обрабатывается только тогда, когда глобальная «сцена» становится доступной для ссылки.Ниже приведен пример использования вашего кода:

public class Main extends MovieClip  {      

    public function Main():void
    {
        if(stage){
            init();
        }else{
            this.addEventListener(Event.ADDED_TO_STAGE, init);
        }
    }

    //Can be private or public, doesn't matter private is better practice
    private function init(e:Event = null)
    {
        //Notice the function paramter has a default value assigned of null. This is required so we can call this function without args as in the constructor       

        //Also the flag variable is not necessary because this function is called once
        btnDialogCreate.addEventListener(MouseEvent.CLICK,CreateProject);        
    }

    //Also it is generally considered bad practice to put capitals on the start of your function/variable names. Generally only classes are named this way ie: Main.
    public function createProject(e:MouseEvent){
        //You do not need a try/catch statement for simply opening a file browser dialogue. This is a native method you're invoking with a native, predefined default directories inside the VM. Flash is already doing this for you
        var directory:File=File.documentsDirectory;
        directory.browseForDirectory("Directory of project");
    }

}

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

http://gotoandlearn.com/

0 голосов
/ 02 апреля 2011

Я нашел решение.

  1. Я изменил кодировку pattern.xml на ANSI

  2. Я изменил алгоритм загрузки XML на этот

Работает!

...