Archive for AS3

Event’ai ( PART III )

// August 11th, 2008 // 2 Comments » // AS3

Garbage Collection

Pažodžiui išvertus skamba nelabai skaniai, bet kiek kaitinėjausi kiek bandžiausi, AS3 GC yra labai naudingas dalykas. Jį galima pavadinti Eventų prižiūrėtoju, tvarkytoju. Visų pirmą – su kuo ir kaip jis yra valgomas:

Jis yra įkomponuojamas į bet kurį addEventListener veiksmą:

eventTarget.addEventListener ( EventType.EVENT_NAME, eventResponse, useCapture : Boolean, priority : int, weakReference : Boolean );

useCapture – taip ir nesupratau normaliai kam jis reikalingas, jeigu jam duodi parametrą false, tai EventListener’is suveikia, jeigu duodi true – neveikia.

priority - eiliškumas, jeigu vienas objektas turi kelis to pačio tipo EventListener’ius:

stage.addEventListener ( MouseEvent.CLICK, onMouseClick_1, false, 99, true );
stage.addEventListener ( MouseEvent.CLICK, onMouseClick_2, false, 100, true );

juos galime surikiuoti. Default’inis eiliškumas yra toks kokia tvarka mes EventListener’ius užregistruojame, bet šiuo atveju ( 99, 100 ) onMouseClick_2 bus įvykdytas pirmas. Kuo didesnis priority skaičius tuo reikšmingesnis tas EventListener’is yra.

weakReference – šito irgi dalinai nepagavau. Priėjau išvados kad šis kintamasis sumažina atminties apkrovimą, ir padeda tuo atveju jeigu po EventLisener’io įvykdymo, EventListener’is nėra pašalinamas. Default’inė jo reikšmė yra false, kiek perėjau forumus, straipsnius tai visi norėtų kad ji kaip būtų true., ir rekomenduoja šitą reikšmę keisti į true.

Dirbtinis Event’as

Įsivaizduokite jūs kūriate žaidimą, kuriame jeigu žaidėjas surenka N taškų turi įvykti sekantys veiksmai:

  • Žaidėjas gauna papildomą gyvybę,
  • Turi sumirksėti fonas,
  • Turi pasigirsti tam tikras garsas
  • Žaidėjas gauna kokį nors bonus’ą

Žinoma visą tai galima būtų sugrūsti į vieną funkciją ir viskas atrodytų gerai, bet… Jeigu kiekvienas iš šių veiksmų turi atskrias funkcijas su visais skaičiavimais ir pan… Vėl gi galima sukurti fukciją kuri iškvietų visas funkcijas ir vėl atrodytų kad mes vis dėl to esame genijai :) . Bet yra paprstensi būdas – dirbtiniai event’ai.

Jie atrodo taip:

addEventListener ( "eventoPavadinimas", eventoFunkcija );

Mūsų atvejų reikėtų idėti kelis eventListener’ius:

myGame.addEventLisener ( "20000points", lvlUp, false, 0, true );
myGame.addEventLisener ( "20000points", playBackground, false, 0, true );
myGame.addEventLisener ( "20000points", playLvlUpSound, false, 0, true );
myGame.addEventLisener ( "20000points", giveRandomStuff, false, 0, true );

taigi visi jie suveiks tada kai bus pasiekta 20000 taškų ir kai bus iškviestas event’as 20000points. Kaip jis iškviečiamas? Šiuo, žaidimo atveju, turi vykti kažkokia tai funkciją kuri skaičiuoja taškus už vieną ar kitą žaidėjo padarytą veiksmą. Ir turės tikrinti aržaidėjas pasiekė tinkamą

private function countScore ( diff : int ) : void {

totalScore += diff;

if ( totalScore >= 20000 ) {

dispatchEvent ( new Event (“20000points”) );

myGame.removeEventListener ( "20000points", lvlUp );
myGame.removeEventListener ( "20000points", playBackground );
myGame.removeEventListener ( "20000points", playLvlUpSound );
myGame.removeEventListener ( "20000points", giveRandomStuff );

}
}

Po to kai yra iššaukiamas ( dispatch ) įvykis ( Event ), visi eventListener’iai kurie buvo užregistruoti bus įvykdyti, tokia eiliškumo tvarka kokia mes juos užregistravome.
Sekančios dvi komandos yra pritaikytos patikrinti ar tam tikras Event’as yra užregistruotas arba kam jis priklauso.

hasEventListener
Patikrina objektą ar jis turi kažkokį tai konkretų Event’ą ( tikrinamas yra objektas ):

myGame.hasEventListener ( "20000points" );

Gražinama reikšmė yra true arba false.

willTrigger
Patikrina ar kažkoks konkretus Event’as yra užregistruotas ( tikrinama yra viskas ):
willTrigger ( "20000points" );

Gražinama reikšmė yra true arba false.

Event’ai ( Part II )

// August 3rd, 2008 // No Comments » // AS3

Key Events

Toliau peržvelgsime dar kelis Event’us:

stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyPressed );
stage.addEventListener( KeyboardEvent.KEY_UP, onKeyReleased );

Funkcijai bus peduodama informaciją apie mygtuko paspaudimą, priklausomai nuo to ko jums reikės galite naudoti kelis parametrus:

keyCode – kiekvieno mygtuko kodas, “S” ir “s” duos tą pati rezultatą.

charCode – jeigu reikia išsiaiškinti ar paspaustas mygtukas yra “S” ar “s”.

keyCode ne tik gali savyje laikyti numeruotą mygtuko kodą bet taip pat ir tiesioginį mygtuko pavadinimą:

function onKeyPressed ( evt:KeyboardEvent ) : void {

switch ( evt.keyCode ) {

case Keyboard.ENTER:
myMovie.gotoAndPlay ( "pradzia" );
break;

case Keyboard.BACKSPACE:
myMovie.stop ();
break;

case Keyboard.LEFT:
myMovie.prevFrame ();
break;

case Keyboard.RIGHT:
myMovie.nextFrame ();
break;

case Keyboard.SPACE:
myMovie.gotoAndStop ( "pabaiga" );
break;

default:
trace ( “keyCode : ”, evt.keyCode );
}
}

Frame Events

FrameĘvent’as turėtų būti žinomas kiekvienam, kuris programuoja Flash AS2. Taigi šis mažas stebuklas liko ir AS3 tik truputėlį patobulintas.

Tiems kas nežino kas tai yra:

FrameEvent’ai yra vykdymi skirtingu principu negu MouseEvent’ai arba KeyEvent’ai. Jie suveikia naturaliai kaip tik flash dokumentas pradeda veikti ( aišku galima pasidaryti kad jie FrameEvent’as pradėtų veiksmą tik po to kai bus įvykdyta kokia nors sąlyga ( pvz.: mygtuko paspaudimas ) ). Taigi funkcija kuri bus priskirta prie FrameEvent’o suveiks kas kartą kai flash dokumentas įeis į naują Frame’ą. Priklausomai nuo to kiek FPS jūsų SWF nustatytą. Jeigu 12, reiškia funkcija bus įvykdomą 12 kartų, jeigu 30, reiškia 30 kartų ir t.t.

Jeigu seniau ( ant AS2 ) vienam objektui galima buvo prikabinti tik 1-ą onEnterFrame veiksmą, tai dabar galime prikabinti kiek tik norime ENTER_FRAME Event’ų.

public var ball    : MovieClip;

public function TimerEvents() {

ball = this["ballMC"];

ball.addEventListener ( Event.ENTER_FRAME, rotateObject );
ball.addEventListener ( Event.ENTER_FRAME, moveObject );

}

public function rotateObject ( evt : Event ) : void {

evt.target.rotation++;

}

public function moveObject ( evt : Event ) : void {

evt.target.x++;

}

Timer Events

Tai yra alternatyva ENTER_FRAME eventui. AS2 – ame buvo naudojamas setInterval() metodas, AS3 tam dalykui turi visiškai naują klasę – Timer.

var timer : Timer = new Timer ( uzlaikymas : Number, kartojimasis : int );

Timer klasė reikalauja dviejų kintamųjų: kas kiek laiko bus įvykdoma funkciją ( p.s. pirmas įvykdymas irgi įvyks po tiek laiko ), kartojimasis – kiek kartų kartosis dabartiniai klasei priskirta funkciją. Taip pat yra labai patogus dalykėlis – start, Timer klasės metodas kuris paleidžia skaitliuką.

var timer : Timer = new Timer ( 1000 );

timer.addEventListener ( TimerEvent.TIMER, onTimer );

timer.start ();

function onTimer ( evt : TimerEvent ) : void {

laikrodis.sRodykle.rotation += 6;

}

Objekto eksportavimas į klasę ( arba klasės pririšimas prie objekto ):

Pirmas žingsnis: Library paspaudžiame ant objekto kurį norime eksportuoti klasei – Linkage…

Tada prie Class nurodome pilną kelia iki tos klasės ( be galūnės ).

ir viskas, turime objektą pririšta prie klasės.

Parsisiųsti: TimerEvents

EventListener’ių pašalinimas

Palikti EventListener’į, tada kai jau nereikalingas nėra labai protingas dalykas. Tvarka turi būti!

Taigi po to kai EventListeneris atliko davo darbą, tarkim patikrino per kiek laiko nuo puslapio užkrovimo vartotojas pirmą kartą spregtelėjo pelės klaviša.

stage.addEventListener ( MouseEvent.CLICK, onFirstMouseClick );

Jis tampa nereikalingas, nes užduotis yra įvykdyta. Taigi mums reikia jį pašalinti. Jis yra pašalinamas tokiu pat būdu kaip ir uždedamas ( turi išlikti tas pats objektas, tas pats Event’as kurio mes klausėmes, ta pati funkcija kurią mes buvome priskirę  )

stage.removeEventListener ( MouseEvent.CLICK, onFirstMouseClick );

Visa tai yra skirta tam kad valdytume atminties užkrovimą, įsivaizduokite kad pas jus yra kelios dešimtys Event.ENTER_FRAME listener’ių, kurių kiekvienas atlieka po kelius šimtus eilučių kodo. Visa tai stabdys CPU ir apkraus atmintį, nors iš visų listener’ių, konkrečiu momentu mums reikės tik po vieną.

Event’ai (PART I )

// July 31st, 2008 // No Comments » // AS3

Event’ai

AS3 kalboje yra naudojama flash.events.EventDispatcher klasė darbui su įvykiais ( Events ). Kiekvieną kartą norėdami pagauti tam tikrą Event’ą reikės naudoti EventDispatcher’io metodus.  Event”ų klausytojai AS3, yra susisteminti, t.y. visi jie uždedami naudojant ta patį metodą addEventListener, kurio pagalba yra klausomasi Eventų ir reguojama atitinkamai, t.y. iškviečiamos konkrečios funkcijos. Visą tai yra intergruota į Flash klasę.

Pavyzdys:

Tarkime mes turime objektą kuri norėsime judinti pelės pagalba.

Objektui uždedame Event’ų listener’ius.
Pirmas listener’is stebės ar pelė yra paspausta ant objekto, jeigu taip tada pradėti draginti objektą
Antras listener’is stebės ar pelė yra atleista nuo objekto, jeigu taip tada nustoti draginti objeką

myMovieClip.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
myMovieClip.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);

private function onStartDrag ( evt : MouseEvent ) : void {

evt.target.startDrag();

}
private function onStopDrag ( evt : MouseEvent ) : void {

evt.target.stopDrag();

}

Dviejų Event’ų klausytojų MouseEvent.MOUSE_DOWN ir MouseEvent.MOUSE_UP logikos kaip viskas ir aišku. Kai įvyksta Event’as jis iškviečia konkrečia funkciją. Fuknciją pasigauna Event’ą, tada jo pagalba nustato objektą target kuriam tas Event’as buvo įvykdytas, tokiu budu  koncrečiam objektui yra priskiriama užduotis – startDrag(); arba stopDrag();

Šios funkcijos yra universalios, evt.target leidžia mums judinti bet kurį objeta Scenoje, nes jis nerą pririštas prie konkretaus objekto. todėl drasiai galima pridėti dar tokį kodo gabaliuką:

myNewMovieClip.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
my
NewMovieClip.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);

Toliau man kilo viena idėja, kas atsitiktu jeigu Event’as MouseEvent.MOUSE_UP įvyktų už Stage’o ribų?
Gavosi toks rezultatas:

Trečias listener’is stebės ar pelė nepaliko mūsų stage’o, jeigu taip tada nustoti draginti?

stage.addEventListener( Event.MOUSE_LEAVE, onMouseLeaveStopDrag );

Vienu metu jau buvau supanikavęs jog MOUSE_LEAVE Event’o nėra. ( Ši funkcija stebi ar pelė nepaliko stage’o ) Nes jo nebuvo prie MouseEvent klasės, po neilgos paieškos išsiaiškinau kad jis yra pririštas prie Event klasės. Su šita funkciją teko paplūšėti, nes listener’is yra pririštas prie stage’o, ir kai pelė palieka stage’ą, mes kaip ir nebeturime evt.target, todėl teko šiek tiek modifikuoti prieš tai buvusias funkcijas:

var myDragingObject : Object = new Object ();

private function onStartDrag ( evt : MouseEvent ) : void {

myDragingObject = evt.target;
evt.target.startDrag();

}
private function onStopDrag ( evt : MouseEvent ) : void {

myDragingObject = new Object ();
evt.target.stopDrag();

}

private function onMouseLeaveStopDrag ( evt : Event ) : void {

myDragingObject.stopDrag();
}

Atrodytų viskas puiku, bet… po kelių testavimų ir konsultacijų priejau prie išvados, kad taip paprastai niekas čia neveiks. Event.MOUSE_LEAVE, negali įvykti tuo metu kai MouseEvent.MOUSE_DOWN yra aktyvus ( t.y. kai pelės kairysis mygtukas yra paspaustas ) Šitoje vietoje mes kol kas sustosime ir šiai sričiai vėlesniuose tyrimuose skirsime daugiau laiko.

Įsivaiduokite jūs turite nuotraukų galeriją, ir reikia kiekvienai ikeltai nuotraukai uždeti sąlygas:
- kai pelė užlipa ant nuotraukos, nuotrauka turi nublankti ( alpha = 0.4 )
- kai pelė nulipa nuo nuotraukos, nuotrauka turi išryškėti ( alpha = 1 )

Visų pirma noriu užkabinti vieną dalykėli, kadangi AS3 yra keli iš požiūrio vienodi MouseEvent’ai:

MouseEvent.ROLL_OVER ir MouseEvent.ROLL_OUT
MouseEvent.MOUSE_OVER ir MouseEvent.MOUSE_OUT

Apie jų skirtumus yra labai paprastai ir gražiai paaiškinta čia. Pridedu ir swf’ą.

Taigi, mes turime tokia situaciją:

private var myGallery    : MovieClip = new MovieClip ();
private var myImage_1    : MyObject;
private var myImage_2    : MyObject;

public function newGallery () {

myImage_1 = new MyObject ( "square", 0x669933, 40, undefined, undefined, false );
myImage_2 = new MyObject ( "square", 0x2255AA, 40, undefined, undefined, false );

myImage_2.x = 50;

myGallery.addChild( myImage_1 );
myGallery.addChild( myImage_2 );

addChild( myGallery );

}

Tam kas nereikėtų n kartų perrašinėti šitos kodo dalies, arba dėti ją į ciklą:

myImage_*.addEventListener( MouseEvent.MOUSE_OVER, onMouseRollOverImage);
myImage_*.addEventListener( MouseEvent.MOUSE_OUT, onMouseRollOutImage );

mes galime priskirti listener’į prie myGallery kintamojo:

myGallery.addEventListener( MouseEvent.MOUSE_OVER, onMouseRollOverImage);
myGallery.addEventListener( MouseEvent.MOUSE_OUT, onMouseRollOutImage);

Tada eina mūsų funkcijos kurios bus atsakingos už paveikliukų ryškėjimą/blankimą
private function onMouseRollOverImage ( evt : MouseEvent ) : void {

evt.target.alpha = 0.4;

}

private function onMouseRollOutImage ( evt : MouseEvent ) : void {

evt.target.alpha = 1;

}

Kaip matote jos vėl gi nėra pririštos prie konkrečių objektų. Remiantis Event’u yra nustatomas konkretus objektas ir jam yra priskiriami tam tikri parametrai, šiuo atveju alpha.

Parsisiųsti: Galerija

Pirmoji klasė ( class )

// July 28th, 2008 // 2 Comments » // AS3

Sukūriau savo pirmąją AS3 klasę. Klasė skirta paprastiems flash objektams piešti, naudojant flash standartinius metodus ir funkcijas. Taip pat pabandysime šiandien ją išnaudoti.

Visų pirmą susikurkite ActionScript failą ( Main.as ) o ne Flash dokumetą. Įrašome klasės skydą ( package ), atsiminkite kad Klasės pavadinimas turi sutapti su Failo vardu:

package {

import flash.display.MovieClip;

public class Main extends MovieClip {

public function Main() {

}
}
}

p.s. Tie kas naudoją FLASH CS3, reikia atlikti sekanti veiksmą: susikurti Flahs Dokunetą (AS3), ir į Document Class laukelį irašyti klasės failo pavadinimą be galūnės.

.fla ir .as kalsė, šiuo atveju turi būti vienoje direktorijoje.

Taigi po eilutės:
import flash.display.MovieClip;

pridedame dar vieną eilute importuojame dirbtinę klasę ( klasės veikimo principą, aprašymą rasite prikabintuose failuose, straipsnio apačioje ):
import ifmi.graph.MyObject;

po to kai klasė yra importuota, apsirašome naują kintamąjį:

public var drawing : DrawObject;

Šioje stadijoje objektas dar nėra sukurtas. Jis bus kūriamas tada kai bus reikalingas:

drawing = new DrawObject ( "square", false, 1, 0x336699, 40 );

mes turime sukurtą objektą, bet jo Stag’e nerodys. AS3 mano nuomone yra labai protingai padaryta kad kiekvienam kintamajam ar objektui yra priskirta sekančia seka:

  • Aprašymas
  • Sukūrimas
  • Panaudojimas

Tai leidžia laisvai jais manipuliuoti. Mes jau apsirašėme objeką, ji sukūrėme, beliko tik panaudoti:

addChild ( drawing );

Kadangi mes pradžioje extendinome MovieClip’ą kuris yra .fla failo root’e tai addChild ten ir suveiks, bei įkels mūsų piešinį.

Bendra package’o ( skydo ) struktūra atrodo sekančiai:

package {

//šioje vietoje yra importuojamos visos klasės kurios bus naudojamos

public class Main extends MovieClip {

//šioje vietoje yra aprašomi kintamieji kurie bus naudojami

public function Main() {

}

//čia taip pat galime aprašyti kintamuosius

}

}

Parsisiųsti: ifmi.drawObject

p.s. jeigu kas nors dirbęs daugiau su klasėm, prašau pakomentuokitę šią, ar struktūra bloga? ar reikėjo kur nors naudoti static? ar dar kas nors. Ačiū.

Metodai, Programavimo pagrindai

// July 23rd, 2008 // 3 Comments » // AS3

Metodai ( Funkcijos )

Metodų pagalbą mes galime nurodyti objektui ką jam reikia daryti, tarkim play(), stop(). Daugumą ActionScript’o klasių turi specifinius metodus, prie viso to, mes taip pat galime susikurti savo metodų, pvz: objectFadeOut() ( metodas kuris prives objektą išnykti ), iš šalies tai bus tik paprasta funkcija.

p.s. neturėjau kur juos padėti, galvojau atskirą postą jiems daryti bet kad nerą ką apie juos daug rašyti…

Programavimo pagrindai

Kadangi AS3 reikalauja tvarkos ir mes jau programuojame klasėmis, tai nutariau užkabinti vieną nedidelę, bet mano manymu svarbią sritį – informacijos apsirašymą.

AS3 kiekvienas objektas ( klasė, kintamasis, metodas, konstantą ) aprašomas tokiu eiliškumu:

[ pobūdis 1 ] [ pobūdis 2 ] [ tipas ] [ pavadinimas ] [ ką veiks? ] [ parametrai ]

Pobūdis 1

public – nusako kad aprašomas objektas bus viesiems prieinamas.

private – nusako kad aprašomas objektas bus prieinamas tik package viduje, bus draudžiama į šį objektą kreiptis iš kitų klasių.

protected – veikia taip pat kaip private, bet į jį galima kreiptis ir iš subklasių.

dynamic – šitas aprašas labai patiks tiems kurie yra per daug susitapatinę su AS2, tvarkos panaikinimas. Klasėje nebereikia aprašinėti kintamųjų, juos galima pridėti iš kitų klasių, kaip sakant on the run…

internal – kiekvienas objektas gauna šitą parametrą pagal nutilėjimą, jis veikia tik toje klasėje ar funkcijoje kurioje yra aprašytas.

Pobūdis 2

final
– nusako jog klasė ar metodas yra galutiniai ir neplečiami.

static – nusako kad kintamasis priklauso pačiai klasei, o ne objektui.

Tipas

class – nusako kad tai bus klasė kurioje bus kintamieji, metodai ar konstantos kurios galės turėti savo parametrus ir t.t.

function – nusako kad tai bus metodas, kuris atliks tam tikrus skaičiavimus ar išvedimus.

var – nusako kad tai bus kintamasis, kuris savyje talpins tam tikrą informaciją.

const – nusako kad tai bus konstanta, skaičius kuris turės ti kvieną reikšmę ir jo negalima bus pakeisti.

Pavadinimas

Kiekvienas mes turime savo programavimo kultūra, todėl manau kad patys sugalvosite kaip turėtu vadintis jūsų kintamasis ar metodas.

Ką veiks?

extends – praplečia klasę.

implements – šito kintamojo paskirties nelabai atvirai pasakius nesupratu ir nenaudoju aš jos, gal kas nors norėtu pasidalitni informacija?

Parametrai

Priklausomai nuo aplinkybių parametrai gali skirtis.

Jeigu ką nors praleidau, papildykite.