. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .




 
 
SEGÉDLETEK

  feltöltve: 1970.01.01 | szerző: ismeretlen | olvasva: alkalommal

 

Betöltés

Régebbi AS verziókban elég sok módszer állt a rendelkezésünkre adatok illetve képek vagy külső swf tartalmak betöltésére, többnyire abból az okból adódóan, hogy mindig javítottak a függvényeken vagy új osztályokat vezettek be és a régiek megmaradtak. As3-ban a betöltési lehetőségek többnyire 2 osztályra korlátozódnak az URLLoader és a Loader osztályokra.

Loader

A Loader osztály segítségével tölthetünk be külső képeket vagy swf fájlokat a mozinkba. Képességeit a MovieClipLoader osztályhoz lehetne hasonlítani többnyire ugyanolyan formátumok betöltésére is képes. A használata viszont már nagyban eltér a korábbi betöltő osztályoktól.

Minden betöltött tartalomhoz tartozik egy speciális objektum, ami a betöltési információkat tárolja ez a LoaderInfo osztály egy példánya és loaderInfo néven érhetjük el. Ide kell figyelőket adnunk, ha a betöltés állapotát akarjuk szemmel tartani. Mivel a betöltés elkezdésekor nem tudunk a betöltendő tartalomra hivatkozni ezért kell ezeket az adatokat a Loader.contentLoaderInfo segítségével lekérni ami a betöltendő tartalom loaderInfo objektumára mutat ahogy az a nevében is benne van. A saját mozink előtöltését is egy ilyen loaderInfo objektummal tudjuk figyelemmel kísérni ami minden display objektumon megtalálható de csak a root-on és a betöltött tartalmakon kap értéket.
Írassuk ki az mozink méretét a loaderInfo segítségével:

var totalBytes:uint = root.loaderInfo.bytesTotal
var loadedBytes:uint = root.loaderInfo.bytesLoaded

trace(totalBytes)
trace(loadedBytes)

Alap esetben ez a két szám ugyanaz lesz, mivel amikor teszteljük az swf-ünk már betöltődött. Remélem sikerült valamennyire érthetőbbé tennem, hogy mire is jó a loaderInfo de ha nem akkor majd a minták biztosan segíteni fognak ebben. Töltsünk be egy képet:

var loader:Loader = new Loader()
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete)
loader.load(new URLRequest("http://www.prodesktop.hu/As3Tut/smallpic.gif"))

function onComplete(event:Event):void{
      addChild(loader)
}

Ha mindent jól csináltunk, akkor egy kis képnek kell megjelennie a bal felső sarokban.
A loader által betöltött tartalom megjelenítésre 2 lehetőségünk van, az egyik hogy magát a loader-t csatoljuk hozzá egy container-hez vagy hivatkozunk a tartalomra. A betöltött tartalomat miután teljesen letöltődött a Loader.content fogja tárolni és onnan is kérhető le. Betöltés után automatikusan hozzáadódik a Loader-hez ami szintén egy display objektum így megjeleníthetjük. Próbáljunk meg egyetlen loader használatával többször betölteni egy képet:

var loader:Loader = new Loader()
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete)

var button:Sprite = createButton()
button.addEventListener(MouseEvent.CLICK,onMouseClick)
addChild(button)

function onMouseClick(event:MouseEvent):void{
      loader.load(new URLRequest("http://www.prodesktop.hu/As3Tut/smallpic.gif"))
}

function onComplete(event:Event):void{
      var loadedCont:DisplayObject = loader.content
      loadedCont.x = Math.random()*200+150
      loadedCont.y = Math.random()*200+30
      loader.unload()
      addChild(loadedCont)
}

function createButton():Sprite{
      var button:Sprite = new Sprite()
      button.graphics.beginFill(0x3C80C4)
      button.graphics.drawRect(10,10,150,30)
      button.graphics.endFill()
      button.buttonMode = true
      return button
}

Ha mindent jól csináltunk, akkor a gombra kattintva mindig új kép töltődik be. Előfordulhat, hogy egy loader használatakor valaki hibát kap a második kép betöltése közben, ez többnyire azért következik be mivel nem távolította el az előzőleg betöltött képet és egy Loader nem tartalmazhat egy display objektumnál többet. A megoldás a Loader.unload() ami eltávolítja a referenciát de nem törli a tartalmat. Mint már felül is említettem, egy objektum csak akkor törlődik, ha nincs rá több referencia és ez vonatkozik a betöltött tartalmakra is.

A betöltés állapotát szintén a contentLoaderInfo segítségével kérhettük le, próbáljuk meg kiírni egy kép betöltési információit:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoadProgress);
loader.load(new URLRequest("http://www.prodesktop.hu/As3Tut/bigpic.jpg"));

function onLoadProgress(event:ProgressEvent):void{
      trace("BytesLoaded: "+event.bytesLoaded)
      trace("BytesTotal: "+event.bytesTotal)
}

function onComplete(event:Event):void {
      addChild(loader);
}

Ebben az esetben a ProgressEvent.PROGRESS-hez kell figyelőket adnunk, aminek eredményeképpen egy ProgressEvent típusú esemény objektumot kapunk aminek van bytesLoaded és bytesTotal tulajdonsága is amikről lekérhetjük a betöltés állapotát. A betöltés befejeztével természetesen dobódik egy COMPLETE esemény.

URLLoader

Az URLLoader képességeihez legközelebb a korábbi AS verziókból ismert LoadVars áll bár sokkal több formátumban képes adatokat betölteni. Segítségével tölthetünk be szöveges tartalmat String ként, bináris adatokat vagy változókat. A betöltés befejezése után az adatok nem a megszokott módon tárolódnak, tehát nem az osztály saját változóivá válnak ahogyan azt a LoadVars-nál már megszokhattuk hanem egy speciális változóban a data-ban lesznek elérhetőek. A betöltött tartalomtól függően változik a data típusa, például szöveges tartalom betöltésekor String típusú lesz.
Próbáljunk meg betölteni egy sima szöveget egy txt fájlból, készítsünk egy szöveges fájlt egy tetszőleges helyen és írjunk bele valamilyen szöveget.

File:
c:/test.txt

File tartalma:
Hello As3!

Ezután futtassuk az alábbi kódot:

var dataLoader:URLLoader = new URLLoader()
dataLoader.addEventListener(Event.COMPLETE,onLoadComplete)
dataLoader.load(new URLRequest("c:/test.txt"))

function onLoadComplete(event:Event):void{
      trace(dataLoader.data)
}

Elvileg most kiíródott a file tartalma, ha mindent jól csináltunk. Próbáljunk meg változókat betölteni szintén egy txt fájlból. Ez azt jelenti, hogy a megfelelő szintaxis segítségével változóneveket írunk a fájlba és értéket is adunk neki amiket majd betöltés után a player értelmez és változókká alakít amik a beállított értéket kapják majd. Azt hogy milyen formátumot kívánunk betölteni az URLLoader.dataFormat segítségével választhatjuk ki. Az elfogadott értékeket az URLLoaderDataFormat nevű osztály tartalmazza statikus konstansok formájában.

File:
c:/test2.txt

File tartalma:
as3var1=value&as3var2=1232

Futtassuk az alábbi kódot:

var dataLoader:URLLoader = new URLLoader()
dataLoader.dataFormat = URLLoaderDataFormat.VARIABLES
dataLoader.addEventListener(Event.COMPLETE,onLoadComplete)
dataLoader.load(new URLRequest("c:/test2.txt"))

function onLoadComplete(event:Event):void{
      trace(dataLoader.data.as3var1)
      trace(dataLoader.data.as3var2)
}

Eredmény:
--------------------------
value
1232
--------------------------

Ha mindent jól csináltunk, akkor a fenti értékeket kapjuk. Fontos megemlíteni még hogy a régebbi verziókban megengedett volt össze vissza & jelek elhelyezése például a sorunk legelején vagy a legvégén lezáró karakterként, de ez AS3-ban már hibát fog okozni. Próbáljuk ki a mintát az alábbi szöveggel:

File:
c:/test2.txt

File tartalma:
&as3var1=value&as3var2=1232

Eredmény:
--------------------------
Error #2101: The String passed to URLVariables.decode() must be a URL-encoded query string containing name
--------------------------

Ezt a sor elején lévő & jel miatt kaptuk mivel ezt így nem tudta értelmezni a dekóder függvény, ezért próbáljuk meg mindig a helyes szintaxis segítségével beírni ezeket a változókat.

 

 
 
 

© Devnet.hu. A segédletek semmilyen formában nem másolhatók, publikálhatók a Devnet.hu és a szerzők közös írásos engedélye nélkül.
 
. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .