Как загрузить внешний SWF на главную сцену из экземпляра дочернего класса? - PullRequest
1 голос
/ 15 апреля 2010

Я пытаюсь получить экземпляр класса для загрузки внешнего SWF и показать его.Пока у меня есть следующее: 1) я написал класс, который использует класс Loader для загрузки внешнего SWF-файла «loadExtSWF».2) У меня есть флаг с именем «MainSWF.fla», который использует класс документа «MainSWF.as».3) У меня есть файл MainSWF.as, который запускает «loadExtSWF» и вызывает loadExtSWF.startLoad для загрузки SWF.

Это почти работает.Экземпляр loadExtSWF загружает внешний SWF-файл, но SWF-файл не отображается.

Если я заменю класс документа fla на loadExtSWF (в нем есть пустой конструктор) вместо MainSWF, и запустим loadExtSWF.startLoad, тогдавнешний SWF загружается и отображается.

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

Есть идеи?Спасибо за помощь.

Пока, RaamEE

PS

Если вы замените класс документа для test_tsscreen с test_tsscreen.as на TSScreen.as и удалите комментарий внутриКонструктор test_tsscreen, SWF будет загружен.

Мой код:

файл test_as3.swf

внешний файл as3 swf.

файл test_tsscreen.fla

флаг fla пуст и ссылается на test_tsscreen.as в качестве класса документа.

файл test_tsscreen.as

package {

 import flash.display.MovieClip;
 import TSScreen;

 public class test_tsscreen extends MovieClip{
  var tsScreen1;

  public function test_tsscreen(){
//   var tsScreen1:TSScreen = new TSScreen(10,10,100,100,0.5,0);
   var tsScreen1:TSScreen = new TSScreen();
   tsScreen1.startLoad(this.stage);
  }
 }
}

файл TSScreen.as

package {
 import flash.display.MovieClip;

 import flash.display.*;
 import flash.net.URLRequest;
 import flash.system.ApplicationDomain;
 import flash.system.LoaderContext;

 import flash.display.Loader;
 import flash.events.Event;
 import flash.events.ProgressEvent; 

 public class TSScreen extends MovieClip implements ITSScreenable{


  public function TSScreen():void{
//   startLoad(this); //Look important comment in above text
  }


  function startLoad(_this:Stage) {
   var mLoader:Loader = new Loader();
   var mRequest:URLRequest = new URLRequest("test_as3.swf");

   mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
   mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
   _this.parent.addChild(mLoader);
   mLoader.load(mRequest);
   trace(this.name);
   trace(_this.name);
  }

  function onCompleteHandler(loadEvent:Event) {
   addChild(loadEvent.currentTarget.content);
  }

  function onProgressHandler(mProgress:ProgressEvent) {
   var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;
   trace(percent);
  }


 }
}

1 Ответ

2 голосов
/ 15 апреля 2010

Как это иногда бывает, задание вопроса приводит к поиску вашего ответа. После прочтения руководства я снова увидел, что после добавления нового SWF-файла в AS3 необходимо добавить новый DisplayObject в качестве дочернего элемента к существующему DisplayObject в существующем DisplayObjectContainer.

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

Вот исправленная версия кодовых блоков, которые я цитировал ранее

test_tsscreen.as

пакет {

import flash.display.MovieClip;
import TSScreen;

public class test_tsscreen extends MovieClip{
    var tsScreen1:TSScreen;

    public function test_tsscreen(){
        tsScreen1 = new TSScreen(10,10,100,100,0.5,0);
        //tsScreen1 = new TSScreen();
        this.addChildAt(tsScreen1,1);
    }
}

}

TSScreen.as

пакет { импорт flash.display.MovieClip;

import flash.display.*;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;

import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;  

public class TSScreen extends MovieClip {
    private var _xPos:int;
    private var _yPos:int;
    private var _width:int;
    private var _height:int;
    private var _xScale:int;
    private var _yScale:int;

    private var _visible:Boolean;
    private var _alpha:Boolean;
    private var _shadow:Boolean;
    private var _backgroundColor:uint;
    private var _rotation:Boolean;

    private var _displayTime:int;


    public function TSScreen():void{
        startLoad();
    }


    function startLoad() {
        var mLoader:Loader = new Loader();
        var mRequest:URLRequest = new URLRequest("C:/FlashProjects/test_as3.swf");

        mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
        mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
        addChild(mLoader);
        mLoader.load(mRequest);
    }

    function onCompleteHandler(loadEvent:Event) {
        addChild(loadEvent.currentTarget.content);
    }

    function onProgressHandler(mProgress:ProgressEvent) {
        var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;
        trace(percent);
    }


}

}

Если вам нужна дополнительная информация, обратитесь к главе 04 книги FriendshipED Foundation ActionScript 3.0 с Flash CS3, в которой содержится полезное введение в эту тему.

Надеюсь, что это поможет другим с такой же проблемой.

...