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


 
 
SEGÉDLETEK Hangkezelés

A dinamikus hangkezelés alapjai Flash-ben
  feltöltve: 2004.05.30 | szerző: caber_net | olvasva: 17830 alkalommal

   
 

A Sound objektum

Segédletünk fő célkitűzése a Sound objektum, valamint annak tulajdonságainak és metódusainak bemutatása. (a teljesség igénye nélkül)

9.LÉPÉS: Hogyan kell létrehozni? Jelöld ki az actions rétegen az első képkockát, nyisd meg az actions palettát, pin current script, majd gépeld be a következőt:

Kész is. Ezzel a fő idősíkon létrehoztunk egy zene nevű hangobjektumot. Ez lesz a kis mp3 lejátszónk lelke.

10.LÉPÉS: Beállítjuk a csúszkákat és a státusz-csíkokat, eltüntetjük az egyelőre felesleges dolgokat, majd felvesszük a szükséges kezdeti változókat. Az i fogja meghatározni, hogy éppen melyik az aktuális track, pos a lejátszófej pozícióját, bal a balansz értékét, vol pedig a hangerőt.

//kezelőszervek alapbeállítása
balance_mc.bar_mc._x = 25;
volume_mc.bar_mc._x = 50;
status_mc.loaded_mc._xscale = 0;
status_mc.played_mc._xscale = 0;
close_btn._visible = false;
trlst_mc._visible = false;
i = 0;
pos = 0;
bal = balance_mc.bar_mc._x*4-100;
vol = volume_mc.bar_mc._x*2;

11.LÉPPÉS: Hozz létre két tömböt. Ezek fogják tárolni a zeneszámok címeit (tracklist), és a hozzájuk tartozó URL-eket (loadlist).

//tracklisting
tracklist = new Array();
tracklist[0] = "track1";
tracklist[1] = "track2";
tracklist[2] = "track3";
//
//betöltendő számok
loadlist = new Array();
loadlist[0] = "web.axelero.hu/caber1/swf/track1.mp3";
loadlist[1] = "web.axelero.hu/caber1/swf/track2.mp3";
loadlist[2] = "web.axelero.hu/caber1/swf/track3.mp3";
//A kijelzőbe kiiratjuk az első zene címét.
display_mc.title_txt.text = "playing: "+tracklist[i];

12.LÉPÉS: Az első zene betöltése. Ezt a loadSound metódussal valósítjuk meg. Segítségével a hangobjektumba külső mp3 fájlokat tudunk betölteni. Működése a következő:

hangobjektum.loadSound("betöltendő zene URL", stream);

Ha a stream boolean értéke false, akkor betöltés közben nem fog szólni a zenénk, utána külön utasítást kell adnunk a lejátszásra. Ha true, akkor már betöltés közben szólni fog. Nagyobb hangfájloknál érdemes true értéket megadni.

//Indító zene betöltése
zene.loadSound(loadlist[i], true);

Ha most teszteled a mozit, máris hallhatod, hogy szól a loadlist tömbben elsőnek megadott zene.

13.LÉPÉS: Loop. A zene lejátszását fogjuk végteleníteni. Ehhez az onSoundComplete eseménykezelőt hívjuk segítségül, amely azt vizsgálja, hogy a zene lejátszása befejeződött-e. Ha igen, akkor start metódussal a zene újboli lejátszására utasítjuk a hangobjektumot. Első paramétere másodpercben megadott érték, innentől kezdi lejátszani a zenét. Második paramétere az ismétlések száma.

zene.onSoundComplete = function() {
  zene.start(0, 1);
};

 

Status bar

14.LÉPÉS: A letöltés és a lejátszás állapotjelzőjének működtetése.

//státusz kijelző működtetése
status_mc.onEnterFrame = function () {
  // töltésellenőrzés
  lod = zene.getBytesLoaded();
  total1 = zene.getBytesTotal();
  prc1 = (lod/total1)*100;
  status_mc.loaded_mc._xscale = prc1;
  // lejátszás ellenőrzés
  played = zene.position;
  total2 = zene.duration*total1/lod;
  prc2 = (played/total2)*100;
  status_mc.played_mc._xscale = prc2;
};

Egy onEnterFrame eseménykezelő figyeli folyamatosan a zene betöltöttségi állapotát, és a lejátszófej helyzetét. A töltésellenőrzés hasonlóan a moziklipekhez a getBytesTotal és a getBytesLoaded segítségével történik.
A hangobjektum hosszát a duration a lejátszófej pillanatnyi helyzetét pedig a position property-k adják vissza ezredmásodpercben. Ez eddig szép és jó, de a duration érték letöltés közben folyamatosan változik, mindig az addig letöltött rész hosszát adja meg, így nem elég a két érték arányait vizsgálnunk, mint a töltésellenőrzésnél. Ennek kiküszöbölésére egy kis trükköt vetettem be. Igaz nem tökéletesen pontos, de annyira igen, hogy megfelelő arányt tudjunk képezni a lejátszófej pozíciójának grafikus ábrázolásához.

Az ötlet hesimtől származik, ő vetette fel a fórumon, hogy a getBytesTotal() és getBytesLoaded() értékeket is vegyük figyelembe, így elég jó közelítéssel meg lehet becsülni a teljes fájl hosszát.

 

Hangerő és balansz

15.LÉPÉS: A hangerő szabályzása. Ezt a setVolume metódus segítségével fogjuk megvalósítani, melynek paramétere egy 0-tól 100-ig terjedő értéket vehet fel. A 0 jelenti a teljes csendet, a 100 a maximális hangerőt.

//hangerő
zene.setVolume(vol);
volume_mc.bar_mc.onPress = function() {
  volume_mc.bar_mc.startDrag(false, 0, 0, 50, 0);
  volume_mc.onEnterFrame = function() {
    vol = volume_mc.bar_mc._x*2;
    zene.setVolume(vol);
  };
  volume_mc.bar_mc.onRelease = volume_mc.bar_mc.onReleaseOutside=function () {
    volume_mc.bar_mc.stopDrag();
    delete volume_mc.onEnterFrame;
  };
};

Egy onEnterFrame segítségével drag-elés közben lekérdeztük a bar_mc moziklip _x értékét, és ezzel arányosan módosítottuk a hangerőt.

16.LÉPÉS: Balansz beállítása. Erre való a setPan metódus. A kivitelezés hasonló a hangerő szabályozásához, de itt egy -100-tól +100-ig terjedő értek között kell változtatnunk a setPan paraméterét. -100-nál csak a bal hangcsatorna szól, +100-nál csak a jobb.

//balansz
zene.setPan(bal);
balance_mc.bar_mc.onPress = function() {
  balance_mc.bar_mc.startDrag(false, 0, 0, 50, 0);
  balance_mc.onEnterFrame = function() {
    bal = balance_mc.bar_mc._x*4-100;
    zene.setPan(bal);
  };
  balance_mc.bar_mc.onRelease = balance_mc.bar_mc.onReleaseOutside=function () {
    balance_mc.bar_mc.stopDrag();
    delete balance_mc.onEnterFrame;
  };
};

 

Válogatás a zenék közül

17.LÉPÉS: A tracklisting kezelését fogjuk megoldani. Először az open_btn és close_btn eseményeire írjuk meg a szükséges dolgokat megjelenítő, illetve eltüntető függvényeket.

//tracklisting eltüntetése-megjelenítése
open_btn.onRelease = function() {
  close_btn._visible = true;
  open_btn._visible = false;
  trlst_mc._visible = true;
};
close_btn.onRelease = function() {
  close_btn._visible = false;
  open_btn._visible = true;
  trlst_mc._visible = false;
};

18.LÉPÉS: A számok kiválasztásakor végbemenő rollOver, rollOut és release függvényeket írjuk meg. Ezeket a trlst_mc-ben levő title moziklipekre alkalmazzuk.

//zene kiválasztására szolgáló függvények
createNewTrack = function () {
  delete (zene);
  zene = new Sound();
  zene.loadSound(loadlist[i], true);
  zene.setVolume(vol);
  zene.setPan(bal);
  zene.onSoundComplete = function() {
    zene.start(0, 1);
  };
};
//
listRollOver = function () {
  this.gotoAndStop(2);
};
//
listRollOut = function () {
  this.gotoAndStop(1);
};
//
listRelease = function () {
  this.gotoAndStop(1);
  trlst_mc._visible = false;
  close_btn._visible = false;
  open_btn._visible = true;
  i = this.num;
  createNewTrack();
};
//
hossz = tracklist.length;
for (j=0; j<hossz; j++) {
  obj = trlst_mc["title"+j+"_mc"];
  obj.title_txt.text = tracklist[j];
  obj.loadlist = loadlist[j];
  obj.num = j;
  obj.onRelease = listRelease;
  obj.onRollOver = listRollOver;
  obj.onRollOut = listRollOut;
}

Hoppá. Nézzük csak meg ezt a createNewTrack függvényt. Igen, jól látod delete (zene).
Joggal merülhetnek fel benned bizonyos kérdések. Miért hoztuk létre az objektumot, hogyha töröljük? Miért töröljük, hogyha újra létrehozzuk?
Bár a Sound objektum nagyon izgalmas és aranyos, mégis felettéb buta jelenség. Ha új zenét töltesz be, a position property értékét nem nullázza le, hanem szorgalmasan számolja tovább, ezzel ellehetetlenítve a status kijelző működtetését. Ezért van szükség a törlésre, majd egy új objektum létrehozására, ami "tiszta lappal" indul.

Ha most teszteled a mozit, már a megadott számok közül is tudsz válogatni. A tracklistán rákattintva elindíthatod annak betöltését, és lejátszását.

 

Kezelés a kontrol gombokkal

19.LÉPÉS Megírjuk a lejátszást vezérlő gombokhoz tartozó callback-eket.

//lejátszás
control_mc.play_btn.onRelease = function() {
  zene.stop();
  zene.start(pos, 1);
  pos = 0;
  display_mc.title_txt.text = "playing: "+tracklist[i];
};
Nézzük végig, mit jelentenek ezek a sorok. A stop metódus segítségével leállítjuk az éppen hallható zenét, nehogy egyszerre több hangsáv szólaljon meg kaotikus hangzást okozva.
Következő sorban start utasítást adjuk a zenénknek. A lejátszás kezdete pos. Ennek értelmét majd a pause gombhoz tartozó scriptnél láthatjuk. Mivel a zenefolyam végtelenítéséről már gondoskodtunk, második paraméternek az "1" érték (nincs ismétlés) megfelelő.
Végül lenullázzuk a pos változó értékét, hogy a gomb újboli lenyomása esetén előről kezdje játszani az aktuális zenét.

//szünet
control_mc.pause_btn.onRelease = function() {
  pos = zene.position/1000;
  zene.stop();
};
A lejátszófej pozicióját másodpercekben eltárolva az aktuális zenét leállítjuk, így a play_btn lenyomásakor innentől kezdődőden folytatódhat a lejátszás. Ezzel azt a hatást érhetjük el, mint egy cd játszónál a pause gomb lenyomásával.

//egy számot előre
control_mc.next_btn.onRelease = function() {
  if (i<hossz-1) {
    i++;
    createNewTrack();
  }
};
Egy feltétellel vizsgálva, hogy nem értünk-e még a lista végére, egyet hozzáadunk az aktuális track-et jellemző i változó értékéhez és meghívjuk a korábban megismert createNewTrack függvényt.

//egy számot vissza
control_mc.prev_btn.onRelease = function() {
  if (i>0) {
    i--;
    createNewTrack();
  }
};
Ugyan az a felállás, mint az next_btn-nél, csak az i értékét csökkentjük.

//leállítás
control_mc.stop_btn.onRelease = function() {
  pos = 0;
  zene.stop();
  display_mc.title_txt.text = "Leállítva: "+tracklist[i];
};
Leállítjuk a zenét, és a pos változó értékét nullával teszük egyenlővé.

 

Összegzés

Végeztünk is. Tesztelheted a mozit és ha nem hibáztál el semmit, akkor az összes funkció működik. Ha változtatni akarsz a zenéken, csak a loadlist és a tracklist tömbök elemeit kell átírnod. Persze létezik ettől sokkal rugalmasabb megoldás. Beolvashatjuk őket változóként egy külső txt állományból is, a tracklist moziklipeket attachMovie-val és for ciklus segítségével behúzva a zenék számától függően rugalmasan változó tracklistinget készíthetünk, de nem akartam a feladatot túlbonyolítani. Ezen kívül még több más funkcióval is bővíthető a lejátszó, legyen ez egy alap, a kihívás adott. Bővítsd, fejleszd és használd ki a benne rejlő lehetőségeket. Kellemes szórakozást!

 
   
 
 

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