Archiwum

Posts Tagged ‘URLRequest’

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.

Kategorie:AS3, podstawy Tagi: , , ,

Wczytywanie XMLa w AS3

28 lutego, 2012 Dodaj komentarz

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.