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:

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: 
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




