Wczytywanie zdjęć w AS3
package { import flash.display.Sprite; import flash.display.Loader; import flash.events.Event; import flash.net.URLRequest; /** * @author andrzej nowak */ public class Main extends Sprite { private var _request:URLRequest; private var _loader:Loader; public function Main():void { _request = new URLRequest("../jpg/logo.jpg"); _loader = new Loader(); _loader.load(_request); _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImgComplete); } private function onImgComplete(e:Event):void { addChild(_loader); } } }
Zasada działania tego kodu jest bardzo prosta. Aby wczytać jakąś zewnętrzną grafikę w kodzie AS3 należy posłużyć się obiektami klas URLRequest oraz Loader. Przy okazji tego postu napisałem co nieco o roli klasy URLRequest tu tylko przypomnę że służy ona do wskazania pliku lub adresu. Nastomiast klasą ładująca jest klasa Loader, po stworzeniu obiektu należy wywołać jego medtodę load() i przekazać w niej obiekt klasy URLRequest wskazujący na plik jaki ma zostać wczytany. Dopuszczalny jest również zapis skrócony:
_loader = new Loader(); _loader.load(new URLRequest("../jpg/logo.jpg"));
Pierwszym haczykiem jest ścieżka do pliku, jak widać zaczyna się ona od sekwencji ../ a więc wyjścia z folderu dzieje się tak dlatego że ścieżkę należy podać względem pliku wynikowego SWF który jak widać jest w folderze „bin” a więc jeden poziom głębiej niż folder „jpg„.
Drugim haczykiem jest to że zdarzenia Event.COMPLETE nasłuchujemy nie bezpośrednio dla obiektu klasy Loader a dla jego właściwości „contentLoaderInfo” która jest obiektem klasy LoaderInfo zawierającym informacje o wczytywanym pliku.
Jeszcze tylko addChild() i wszystko zrobione.
Wczytywanie XMLa w AS3
Nie będe się tu rozpisywał o samym XMLu bo nie ma o czym – właściwie całą niezbędną wiedze znajdziecie tutaj.
oto przykładowy plik:
<phones> <person> <name>Adam</name> <surname>Kowalski</surname> <number>123-456-789</number> <type>mobile</type> </person> </phones>
a oto kod AS3 służący do wczytania tego pliku:
package { import flash.events.Event; import flash.events.EventDispatcher; import flash.net.URLLoader; import flash.net.URLRequest; /** * XMLLoader * @author andrzej nowak */ public class XMLLoader extends EventDispatcher { private var _adres:String = "sciezka_pliku"; private var _request:URLRequest; private var _loader:URLLoader; private var _xml:XML; public function XMLloader():void { _request = new URLRequest(_adres); _loader = new URLLoader(_request); _loader.addEventListener(Event.COMPLETE, onXMLComplete); } private function onXMLComplete(e:Event):void { _xml = new XML(e.target.data); dispatchEvent(new Event("DONE")); } public function get xml():XML { return _xml; } } }
Zanim omówie powyższy kod chciałbym tylko zaznaczy jedną rzecz. Klasa URLLoader służy z grubsza do wczytywania danych tekstowych a więc nie musi to być plik *.xml sensu stricto, co więcej nie musi to być w ogóle XML. Klasa to równie bezproblemowo wczyta pliki *.txt zawierające zykły tekst. No dobrze ale co z tego. Otóż to, że na etapie wczytywania XML jest przez AS3 traktowany jak zwykły plik tekstowy (no bo w sumie jest tekstem tylko specyficznym i uporządkowanym). Wynikają z tego dwie rzeczy – pierwsza, nie można od tak sobie uzyskać dostępu do danych (konkretnych węzłów, tagów) w XMLu bezpośrednio po jego wczytaniu zanim nie powiemy AS3 z czym ma tak naprawdę do czynienia. Druga sprawa jest taka że jest to absolutnie obojętne w jakim pliku kod XMLa się znajduje – tzn nie musi to być plik z rozszerzeniem *.xml, może być *.txt, albo jakiekolwiek inne nawet realnie niespotykane. Na przykład jeśli w pliku zawarta jest wersja językowa dla twojej aplikacji to może on mieć rozszerzenie *.lang, a jeżeli jest to plik licenji to *.lic. Dla plików zawierających konfiguracje aplikacji (jakieś podstawowe ustawienia wczytywane na starcie) często spotyka się zastosowanie rozszerzenia *.dat – pliki takie są w tym przypadku oczywiście zwykłym XMLem natomiast wyglądają zdecydowanie bardziej „profesjonalnie” oraz z reguły nie są powiązane z żadnym oprogramowaniem więc ich otworzenie wymaga chociaż minimum wysiłku.
Wracając do kodu – cała historia zaczyna się konstruktorze gdzie tworzone są obiekty. Klasa URLRequest jest niezbędna aby wskazać na plik który chcemy wczytać, nie ważne czy znajduje się on w systemie plików czy gdzieś w sieci. W konstruktorze nowego obiketu URLRequest musimy przekazać ścieżkę dostępu w formacie String – czyli nic innego jak jej tekstową reprezentacje np: „xml/phones_data.xml”. Możemy więc w uproszczeniu potraktować obiekt klasy URLRequest jako odwołanie do świata zewnętrznego – bo AS3 pracuje w środowisku FlashPlayer’a wiec nawet pliki będą elementami zewnętrznymi. W praktyce do niemal wszystkiego odwołujemy się przez obiekty klas URLRequest.
Odwołanie wskazujące na plik przekazujemy następnie do obiektu klasy URLLoader która to wczytuje zawartość pliku. W tej chwili najważniejsze jest dla nas wiedzieć że obiekt klasy URLLoader generuje zdarzenie Event.COMPLETE w momencie gdy wczytywanie się skończy -oczywiście nasłuchujemy tego zdarzenia za co odpowiada funkcja onXMLComplete. W tej chwili dokument jest już wczytany ale nie jest niczym więcej jak tekstem. Dopiero przekazani zawartości pliku do obiektu klasy XML skonwertuje go na XML’a z krwi i kości.
Dzieje się to w tej lini 28 gdzie do nowo tworzonego obiektu klasy XML przekazywany jet ciąg „e.target.data” – samo „e” to argument jaki otrzymuje funkcja onXMLComplete a więc event. Każdy Event ma właściwość „target” przenosząca odwołanie do obiektu dla którego event był nasłuchiwany, a my nasłuchiwaliśmy go dla obiektu klasy URLLoader (linia 24). Reasumując „e.target” przenosi nas do obiektu wyczytującego a on ma z kolei właściwość „data” w której są przechowywane wczytane dane.
Na koniec nasz kod sam generuje zdarzenie i posiada publiczną funkcję dostępową (w postaci getter’a) umożliwiającą pobranie już obrobionego XML’a.