Posted by: riser on: marzec 21, 2009
Czyli galeria flash + XML. Zadaniem tego małego tutoriala jest utworzenie prostej galerii zdjęć, bazującej na danych zawartych w dokumencie XML.
<galeria>
<obraz lokalizacja="photo/photo_1.jpg" opis="obrazek 1"/>
<obraz lokalizacja="photo/photo_2.jpg" opis="obrazek 2"/>
<obraz lokalizacja="photo/photo_3.jpg" opis="obrazek 3"/>
<obraz lokalizacja="photo/photo_4.jpg" opis="obrazek 4"/>
<obraz lokalizacja="photo/photo_5.jpg" opis="obrazek 5"/>
<obraz lokalizacja="photo/photo_6.jpg" opis="obrazek 6"/>
</galeria>
package {
import flash.net.*;
import flash.display.*;
import flash.events.*;
}
public class MojaGaleria extends Sprite {
public function MojaGaleria() {
trace("Hallo!");
}
package {
import flash.net.*;
import flash.display.*;
import flash.events.*;public class MojaGaleria extends Sprite {
public function MojaGaleria() {
trace("Hallo!");
}
}Deklaracja zmienny globalnych w AS. Zmienne globalne deklarujemy przed funkcjami.
public var nazwa:typ;Deklarując zmienne lokalne w AS MUSIMY od razu przypisać do niej wartość
var nazwa:typ = wartosc;Tworzenie nowych obiektów
new NazwaObiektu(parametry_konstruktora);
Musimy zadeklarować zmienną globalną typu URLLoader. U mnie nazywa się ona loader. Globalną ponieważ będziemy się do niej odnosić z funkcji loading().
public var loader:URLLoader;
Następnie tworzymy zmienną typu URLRequest. U mnie nazywa się ona link. Jako parametr konstruktora podajemy w cudzysłowie lokalizację pliku XML.
var link:URLRequest = new URLRequest("baza.xml");
Do wcześniej utworzonej zmiennej globalnej przypisujemy nowy obiekt typu URLLoader.
loader = new URLLoader();
Do zmiennej loader dodajemy ‘punkt nasłuchiwania’. addEventListener(zdarzenie, funkcja) Spowoduje to wykonanie się funkcji funkcja po wykonaniu się zdarzenia zdarzenie. W naszym przykładzie spowoduje to uruchomienie funkcji loading po załadowaniu pliku wskazywanego przez zmienna loader.
loader.addEventListener(Event.COMPLETE, loading);
Pozostało nam wskazać co ma załadować nasz loader. W tym celu posłużymy się funkcją load, której argumentem jest zmienna typu URLRequest. Tak więc aby załadować plik XML wpiszemy
loader.load(link)
Pozostało nam więc tylko napisanie funkcji laoding, której zadaniem będzie parsowanie pliku XML. Tworzymy więc zmienną typu XML
var XMLgaleria:XML = new XML();
i przypisujemy tej zmiennej zawartość pliku XML po przeprowadzeniu parsowania.
XMLgaleria = XML(loader.data);
Następnie wyświetlamy treść pliku
trace(XMLgaleria);
Jeśli wszystko poszło poprawnie to podczas testowania filmu (ctrl+enter) w Panelu wyjście powinna wyświetlić się zawartość naszego pliku XML.
A tak powinien wyglądać nasz kod na stan obecny.
package {
import flash.net.*;
import flash.display.*;
import flash.events.*;
public class MojaGaleria extends Sprite {
public var loader:URLLoader;
public function MojaGaleria() {
trace("Hallo!");
var link:URLRequest = new URLRequest("baza.xml");
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loading);
loader.load(link);
}
function loading(evt:Event):void {
var XMLgaleria:XML = new XML();
XMLgaleria = XML(loader.data);
trace(XMLgaleria);
}
}
}
Składnia pętli for each
for each (var nazwa_zmiennej in nazwa_tablice) { }
Dostęp do zawartości pól tablicy uzyskujemy przez zmienną.
Dla składni XML, którą posługuje się w tym przykładzie dostęp do zmiennych jest bardzo prosty. Obdywa się poprzez napisanie nazwa_zmiennej.@lokalizacja
Posłużymy się pętlą for each, która wykonuje się dla wszystkich elementów tablicy
for each (var obraz in XMLgaleria.children()) {}
Teraz zajmiemy się wnętrzem pętli. Musimy stworzyć załadować obrazki. Tworzymy więc zmienną typu URLRequest w której podamy lokalizacje obrazka oraz Loader
var req:URLRequest = new URLRequest(obraz.@lokalizacja);
var img:Loader = new Loader();
Ładujemy obrazek do zmiennej
img.load(req);
Aby wyświetlić obiekt na scenie posługujemy się funkcją addChild
addChild(img);
Jeśli wszystko poszło dobrze i nie mamy żadnych błędów, powinniśmy zobaczyć ostatni obrazek. To dobrze, oznacza to, że załadowaliśmy wszystkie obrazki, jednak nakładają one się na siebie dlatego widzimy tylko ostatni. Nasz plik powinien wyglądać tak
package {
import flash.net.*;
import flash.display.*;
import flash.events.*;
public class MojaGaleria extends Sprite {
public var loader:URLLoader;
public function MojaGaleria() {
trace("Hallo!");
var link:URLRequest = new URLRequest("baza.xml");
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loading);
loader.load(link);
}
function loading(evt:Event):void {
var XMLgaleria:XML = new XML();
XMLgaleria = XML(loader.data);
trace(XMLgaleria);
for each (var obraz in XMLgaleria.children()) {
var req:URLRequest = new URLRequest(obraz.@lokalizacja);
var img:Loader = new Loader();
img.load(req);
addChild(img);
}
}
}
}
var tablica:Array = [[0,0],[0,200],[200,400],[200,200],[0,400],[200,0]];
var i:int = 0;img.x = tablica[i][1];
img.y = tablica[i][0];
i+=1;
Jeśli wszystko się udało powinniśmy zobaczyć obrazki w następującej kolejności: 1,2,5,6,4,3. A nasz powinien wyglądać tak
package {
import flash.net.*;
import flash.display.*;
import flash.events.*;public class MojaGaleria extends Sprite {public var loader:URLLoader;public function MojaGaleria() {
trace("Hallo!");
var link:URLRequest = new URLRequest("baza.xml");
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loading);
loader.load(link);
}function loading(evt:Event):void {
var XMLgaleria:XML = new XML();
XMLgaleria = XML(loader.data);
trace(XMLgaleria);var tablica:Array = [[0,0],[0,200],[200,400],[200,200],[0,400],[200,0]];
var i:int = 0;
for each (var obraz in XMLgaleria.children()) {
var req:URLRequest = new URLRequest(obraz.@lokalizacja);
var img:Loader = new Loader();
img.load(req);
img.x = tablica[i][1];
img.y = tablica[i][0];
addChild(img);
i+=1;
}
}
}
}import flash.text.TextField;var txt:TextField = new TextField();txt.text = obraz.@opis;
addChild(txt);
txt.x = tablica[i][1]+75;
txt.y = tablica[i][0]+150;
Tak wygląda gotowy plik
package {
import flash.net.*;
import flash.display.*;
import flash.events.*;
import flash.text.TextField;public class MojaGaleria extends Sprite {public var loader:URLLoader;
public function MojaGaleria() {
trace("Hallo!");
var link:URLRequest = new URLRequest("baza.xml");
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loading);
loader.load(link);
}function loading(evt:Event):void {
var XMLgaleria:XML = new XML();
XMLgaleria = XML(loader.data);
trace(XMLgaleria);
var tablica:Array = [[0,0],[0,200],[200,400],[200,200],[0,400],[200,0]];
var i:int = 0;
for each (var obraz in XMLgaleria.children()) {
var req:URLRequest = new URLRequest(obraz.@lokalizacja);
var img:Loader = new Loader();
img.load(req);
img.x = tablica[i][1];
img.y = tablica[i][0];
addChild(img);
var txt:TextField = new TextField();
txt.text = obraz.@opis;
addChild(txt);
txt.x = tablica[i][1]+75;
txt.y = tablica[i][0]+150;
i+=1;
}
}
}
}A tu można pobrać plik z gotową galerią (Uwaga tylko pliki *.swf,*.xml oraz zdjęcia !)
Coś mi to nie hula.
ja dziś wieczorem się za to wezmę to zobaczymy czy mi zadziała a póki co druknę sobie ten txt do pociągu bo zaraz wychodzę ^^”
Super tutek. Zrobiłem krok po kroku i działa ok. nie ładuje mi tekstu pod obrazkami, ale musze dokładnie przeanalizować kod. po co fla, skoro wszystko jest opisane? Działasz w całym projekcie (.flp) a nie tylko w fla.
ok, juz hula. moja literówka:) dzieki bardzo za tutka.
A Co W Takim Razie Wpisujemy W .fla i gdzie ?
Litości Piotruś Ty z kapusty wyskoczyłeś …..
Wpisujesz to do Action Panel, jednak z Twoją znajomością tematu nie sądzę by moja wskazówka była pomocna …..
maj 22, 2009 @ 9:41 pm
Szkoda, że nie ma FLAka