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


 
 
SEGÉDLETEK ActionScript

Dinamikus képgaléria és képátmenet by BitmapData
  feltöltve: 2007.01.06 | szerző: Reider | olvasva: 12405 alkalommal

     
 

Az actionscript rész

Elég gyorsan eljutottunk ide és most már csak az actionscript nevű layer első frémjén lévő scriptet fogjuk megírni. Csak ezen az egy frémen van script, sehol máshol nincs rá szükség, minden további mozgást script segítségével fogunk elkészíteni.

//Ezeket az importált osztályokat fogjuk majd később használni.
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.filters.DropShadowFilter;
import flash.geom.Point;

//Létrehozunk egy _depth nevű változót minden MovieClip objektumon és 0-ra inicializáljuk
MovieClip.prototype._depth = 0;

Ezzel a sorral a Movieclip osztály prototípusához adok egy változót, ami a _depth. A prototípusokról most nem írok, a lényeg, hogy amikor ezt megteszem akkor az összes MovieClipen ott lesz ez a változó, így nem kell mindig létrehozni. Ezt később látni fogjuk, hogy mire jó.

//Általános beállítások
Stage.showMenu = false;
Stage.scaleMode = "noScale";
Stage.align = "TL";

//Definiáljuk a változókat
var picArray:Array;
var loaded:Number;
var index:Number;
var tempDepth:Number;
var inSpeed:Number;
var outSpeed:Number;
var inloadedParts:Number
var totalParts:Number
var swfLoaded:Boolean;

var pixelSnap:Number

var mcPics1:Array;
var mcPics2:Array;
var movieLoader:MovieClipLoader;
var movieListener:Object;
var shadowFilter:DropShadowFilter;

//Alapállapotba állítjuk a programot a megfelelő függvények meghívásával
initVars();
intitPartField();
createShadowFilter();
loadAndCreateBitmap(getItem(1));

//Ez a függvény ad értéket a fent definiált változóinknak
function initVars():Void {
      //Ez a tömb tartalmazza a képeket amiket a flash kezel
      picArray = ["contentPictures/1.jpg", "contentPictures/testContent.swf", "contentPictures/2.jpg",       "contentPictures/3.jpg"];
      //Megadjuk hogy vertikálisan hány darabra szeretnénk vágni a képet
      partsVert = 10;
      //Megadjuk hogy horizontálisan hány darabra szeretnénk vágni a képet
      partsHor = 10;
      //Ez a változó adja meg hogy a kockák a helyükre kerülés előtt mekkorát ugorjanak.
      pixelSnap = 3

      //A loaded változó tárolja hogy éppen melyik holderbe van a képünk betöltve
      loaded = 1;
      //Az index meghatározza hogy melyik elemnél tart éppen a tömbünk
      index = -1;
      //A befelé mozgó darabok sebessége. Érték: inSpeed > 0 Minél nagyobb annál lassabb a mozgás
      inSpeed = 5;
      //A kifelé mozgó darabok sebessége. Érték: outSpeed > 0 Minél kisebb annál lassabb a mozgás
      outSpeed = 5;
      //Itt tároljuk hogy swf-et töltöttünk-e be
      swfLoaded = false;
      //A már helyüket elfoglalt beúszó darabok száma
      inloadedParts = 0
      //Annak a száma hogy hány darabból áll a kép
      totalParts = 0
      //Definiáljuk a 2 tömböt ami majd a darabokat fogja tartalmazni
      mcPics1 = new Array();
      mcPics2 = new Array();
      movieLoader = new MovieClipLoader();
      movieListener = new Object();

      //Létrehozunk 2 movieclipet amik a képeket fogják tartalmazni
      this.createEmptyMovieClip("bigHolder1", this._depth++); //(*1*)
      this.createEmptyMovieClip("bigHolder2", this._depth++);

      //Definiáljuk a temp Movieclipünk depth-jét
      tempDepth = this._depth++;
      //Előtérbe hozzuk a preloaderünket
      preloader.swapDepths(this._depth++);
      
//Hozzáadjuk a listener-t a moveiClipLoader-hez
      movieLoader.addListener(movieListener);
}

(*1*)
Most felmerülhet a kérdés, hogy miért nem a this.getNextHighestDepth() -et használom, amikor létrehozom az mc-ket, hiszen ez lenne a legkézenfekvőbb megoldás. Próbáljuk ki a következőt:
Húzzunk át egy komponenst például a button komponenst egy üres moziba, majd futtassuk le a következő kódot:

//Ez a kódrészlet nem tartozik szorosan a tutorialhoz
this.createEmptyMovieClip("test", this.getNextHighestDepth());

trace(test);     //az eredmény: _level0.test
test.removeMovieClip();
trace(test);
     //az eredmény ismét: _level0.test

A test Movieclipünk nem tűnt el noha utasítást adtunk erre. Ez azért van, mert a komponensek külön szinteken mozognak mint az álltalunk dinamikusan készített movieClipek, és amikor meghívjuk a this.getNextHighestDepth()-et, a komponens szint (1048576) fölé fogja vinni a clipünket, és komponens szintről már nem tudjuk kitörölni, úgyhogy ez hibákat okozhat.

Én most a saját módszeremet használom, hogy elkerüljem az esetleges ebből adódó hibákat. Másik megoldás lehet még továbbá, hogy a for ciklusban egy állandóan növekvő változó értékét adjuk meg depthnek, de itt ez a módszer nem működne mivel az éppen kifelé tartó képkockák eltűnnének.

//Ez a függvény állítja be a két input mezőnk tulajdonságait
function intitPartField():Void {
      horNumField.restrict = "0-9";
      vertNumField.restrict = "0-9";
      horNumField.maxChars = 2;
      vertNumField.maxChars = 2;
}

//Létrehozunk egy shadow filter-t
function createShadowFilter():Void {
      var distance:Number = 20;
      var angleInDegrees:Number = 45;
      var color:Number = 0x000000;
      var alpha:Number = .3;
      var blurX:Number = 4;
      var blurY:Number = 4;
      var strength:Number = 1;
      var quality:Number = 3;
      var inner:Boolean = false;
      var knockout:Boolean = false;
      var hideObject:Boolean = false;
      shadowFilter = new DropShadowFilter(distance, angleInDegrees, color, alpha, blurX, blurY, strength,       quality, inner, knockout, hideObject);
}

//Ez a függvény betölt egy képet a moviecliploader segítségével majd továbbítja azt
function loadAndCreateBitmap(url:String):Void {
      //Létrehozunk egy mc-t amit csak az átmásolásig fogunk használni
      var holder:MovieClip = this.createEmptyMovieClip("temp", tempDepth);
      movieListener.onLoadStart = function() {
            holder._visible = false
            preloader._visible = true;
      };

      movieListener.onLoadProgress = function(target:MovieClip, bytesLoaded:Number,       bytesTotal:Number):Void {
            var percent:Number = Math.round((bytesLoaded/bytesTotal)*100);
            preloader.preField.text = "Loading: "+percent+"%";
      };
      movieListener.onLoadInit = function(target:MovieClip):Void {

            //Amikor sikeresen betöltődik a képünk ez a függvény fog meghívódni
            initData(target);
      };
      movieListener.onLoadError = function(target:MovieClip, errorCode:String):Void {
            trace("Nem sikerült betölteni a képet "+errorCode);
      };
      movieLoader.loadClip(url, holder);
}

 
     
 
 

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