25.06.2012 20:52
Wysyłanie danych z preloader'a do wczytanego SWF'a [podstawowy]
Kontynuują temat interfejsów z poprzedniego wpisu, wspomniałem tam o scenariuszach w których ich wykorzystanie jest niezastąpione i jednym z takich przykładów jest komunikacja z plikiem SWF wczytanym do aplikacji, najczęściej spotykanym w preloaderach właśnie.
Zacznijmy od standardowego przykładu preloadera:
![](./BLOG/doc_class.png)
W taki sposób aby animacja nie startowała automatycznie oraz aby nie dało się tego wymusić z zewnątrz:
Napisanie super.play() spowoduje, że pominięta zostanie nasza implementacja a wykorzystany zostanie "prawdziwy" play() z klasy MovieClip. Pozostaje nam już tylko to prze testować w preloaderze:
(Plik animacji znajduje się tutaj: MyAnimation.swf - każdy kto szuka wyzwania może spróbować wczytać ten plik samemu)
Źródła: PreloaderInterface.zip
Zacznijmy od standardowego przykładu preloadera:
var loadLoader:Loader = new Loader(); loadLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded); loadLoader.load(new URLRequest("MyAnimation.swf")); function onLoaded(e:Event):void { addChild(loadLoader.content); }W tym wypadku plik MyAnimation.swf i jego zawartość zostanie wrzucony na scenę jak tylko preloader go w pełni załaduje. Jest to najprostsze rozwiązanie nie dające nam praktycznie żadnej kontroli nad tym kto i jak może wczytać ową animację, dlatego powiedzmy że chcielibyśmy aby ta odtwarzała się jedynie wtedy gdy preloader poda prawidłowe hasło. W tym celu należy przejść do pliku animacji i utworzyć dla niej nową klasę dokumentu:
![](./BLOG/doc_class.png)
W taki sposób aby animacja nie startowała automatycznie oraz aby nie dało się tego wymusić z zewnątrz:
public class MyAnimation extends MovieClip { public function MyAnimation() { super.gotoAndStop(1); } public override function gotoAndStop(frame:Object,scene:String=null):void { return; } public override function gotoAndPlay(frame:Object,scene:String=null):void { return; } public override function play():void { return; } }Teraz nawet my nie będziemy w stanie odtworzyć danej animacji, dlatego czas przygotować obejście z którego tylko my będziemy mogli skorzystać, oczywiście wykorzystując do tege interfejs. Niech wygląda on tak:
public interface IMyInterface { function playUsingPassword(pass:String):void; }A zaimplementowany w naszej klasie MyAnimation:
public class MyAnimation extends MovieClip implements IMyInterface { public function MyAnimation() { super.gotoAndStop(1); } public function playUsingPassword(pass:String):void { if(pass == "MyPassword") super.play(); } public override function gotoAndStop(frame:Object,scene:String=null):void { return; } public override function gotoAndPlay(frame:Object,scene:String=null):void { return; } public override function play():void { return; } }(Nie zapomnij o implements!)
Napisanie super.play() spowoduje, że pominięta zostanie nasza implementacja a wykorzystany zostanie "prawdziwy" play() z klasy MovieClip. Pozostaje nam już tylko to prze testować w preloaderze:
var loadLoader:Loader = new Loader(); loadLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded); loadLoader.load(new URLRequest("MyAnimation.swf")); function onLoaded(e:Event):void { addChild(loadLoader.content); var main:IMyInterface = loadLoader.content as IMyInterface; if(main != null) main.playUsingPassword("MyPassword"); }W efekcie dostając:
(Plik animacji znajduje się tutaj: MyAnimation.swf - każdy kto szuka wyzwania może spróbować wczytać ten plik samemu)
Źródła: PreloaderInterface.zip