Archive for July, 2008

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

Tiems kurie skūba.

// July 29th, 2008 // 2 Comments » // Naujienos

Tiems kuriems mano gretis gal būt atrodo per lėtas siūlau sekantį variantą, kurio pagalbą kaip skelbia Adobe Flex Developer Center, galima išmokti Flex per savaię ar mažiau:

Video tutorialai apie Flex.

source: Serge Jespers.

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.

Savybės

// July 21st, 2008 // 3 Comments » // AS3

Savybės

Savybių pagalba mes galime sužinoti / pakeisti objekto informaciją, tarkime MovieClip’o _alpha savybę.
Sužinoti galima visų objektų savybes, tarkime kokia yra MovieClip’o spalva, koks yra Stage’o plotis, bet pakeisti galime ne visus, tarkime Stage’o plotį.

Pavyzdžiai:

Objekto kordinačių nustatymai ( nurodome koordinates ):
myMovieClip.x = 150;
myMovieClip.y = 200;

Objekto skalės nustatymai ( nurodoma skalė, 1 = 100% ):
myMovieClip.scaleX = .5;
myMovieClip.scaleY = .5;

Objekto dydžio nustatymai ( nurodomas plotis ir aukštis ):
myMovieClip.width = 50;
myMovieClip.height = 50;

Objekto pasvyrimo nustatymas ( nurodomas kampas, laipsniais. Jeigu yra įvedma > 360°, flashas automatiškai paskaičiuoja atitikmenį, todėl vargintis patiems su skaičiavimais nereikia ) :
myMovieClip.rotation = 45;

Objekto permatomumo nustatymas ( nurodomas permatomumas 1 = 100% ):
myMovieClip.alpha = .5;

Objekto matotmumo nustatymas ( nurodoma Boolean reikšmė ar objektas bus matomas ar ne, default yra true ):
myMovieClip.visible = false;

Tie kas bent kiek yra susidūrę su AS2, iš karto pamatys nedidelį skirtumą, tarp AS3 ir AS2 savybių. Pagrindinės savybės prarado – “_” ( underscore’ą ).

Taip pat mes galime susikurti savo Objektą, Klasę, kuriame mes patys galėsime apsirašyti mums reikiamas savybes arba metodus.