Event’ai ( PART III )

// August 11th, 2008 // 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.


2 Responses to “Event’ai ( PART III )”

  1. R.A. says:

    kiek isbandziau paieska nepilnai veikia. paraso tik pranesima kad nerado. o kad ir is tavo puslapio kokius zodzius is teksto nukopijuoji ismeta pradini ir viskas. bent jau, kiek bandziau, dabar taip yra.

  2. ifmi says:

    Įdomiai… nes man paieška kaip tai veikia kuo puikiausiai.

Leave a Reply