FLASH MAHER
Adobe Flash Professional – Univerzalna knjiga
ACTION SCRIPT 3.0
DOGAĐAJI
Za savladavanje događaja najpre se moraju znati funkcije. AS3.0 nam nudi programiranje funkcija koje se izvršavaju klasičnim pozivanjem i funkcija koje se izvršavaju kada se desi neki događaj.
Događaji su osnova formiranja dinamičkog sadržaja. U zavisnosti od toga šta se desi – pritisak na neko slovo tastature, klik mišem i slično, programiraju se odgovarajuće akcije. Najviše su u upotrebi događaji koji se izvršavaju posle određenog vremena (TimerEvent), događaji izazvani tastaturom (KeyboardEvent), i događaji izazvani mišem (MouseEvent). Za njihovo korišćenje potrebno je da programu damo informaciju da prati – sluša kada se desi događaj, i kada se to desi da izvrši predviđenu akciju – funkciju. Svako kodiranje događaja ima sličan postupak, ali svaki događaj ima svoj kod gde je opisan tip događaja, tip osluškivanja i ime funkcije koja se izvršava kada se događaj desi.
Događaj koji se izvršava posle određenog vremena je najviše u upotrebi. U narednom primeru koristimo pomeranje kruga na svakih 30 ms za 2 piksela levo ili desno.
import flash.display.Sprite;
import flash.events.TimerEvent;
var Step:int = 2;
var Circle:Shape = new Shape();
Circle.x = Circle.y = 200;
Circle.graphics.beginFill(0x000000);
Circle.graphics.drawCircle(0, 0, 100);
Circle.graphics.endFill();
stage.addChild(Circle);
var NewTimer:Timer = new Timer(30);
NewTimer.addEventListener(TimerEvent.TIMER, MoveCircle);
NewTimer.start();
function MoveCircle(event:TimerEvent):void {
if(Circle.x == 100 || Circle.x == 450) {
Step *= -1;
}
Circle.x += Step;
event.updateAfterEvent();
}
Kada u radu treba da prekinemo izvršavanje bilo kog događaja, kao što smo ga uključili, potrebno je i da ga isključimo. Naredba za to je ’removeEventListener’, koja se koristi isto kao i ’addEventListener’. Za ’TimerEvent’ je poželjno upotrebiti i ’NewTimer.stop()’ za zaustavljanje tajmera iz gornjeg primera.
Primer 3: Analogni i digitalni sat!
import flash.text.TextField;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.MovieClip;
import flash.filters.GlowFilter;
import flash.filters.DropShadowFilter;
import flash.text.TextFormat;
var Now:Date;
var NewTextFormat:TextFormat = new TextFormat(“courier”, 20, 0x000000, true, false, false, null, null, “center”);
var Glow:GlowFilter = new GlowFilter(0x000000, 0.5, 10, 10);
var Shadow:DropShadowFilter = new DropShadowFilter(5, 45, 0x000000, 0.7);
var DigitalClock:TextField = new TextField();
DigitalClock.width = 550;
DigitalClock.defaultTextFormat = NewTextFormat;
DigitalClock.filters = [Glow];
stage.addChild(DigitalClock);
var AnalogClok:MovieClip = new MovieClip();
for(var Id:int = 0; Id < 24; Id ++) {
AnalogClok.graphics.lineStyle(2, 0x000000, 1);
var BodyMatrix:Matrix = new Matrix(1, 0, 0, 1, 0, 0);
BodyMatrix.createGradientBox(20, 20, 0, 275 – 150 * Math.cos(360 / 12 * Id * Math.PI / 180)-10, 200 – 150 * Math.sin(360 / 12 * Id * Math.PI / 180)-10);
AnalogClok.graphics.beginGradientFill(“radial”, [0xdddddd, 0x333333], [1, 1], [0, 255], BodyMatrix, “repeat”, “rgb”, 0);
AnalogClok.graphics.drawCircle(275 – 150 * Math.cos(360 / 12 * Id * Math.PI / 180), 200 – 150 * Math.sin(360 / 12 * Id * Math.PI / 180), 10);
AnalogClok.graphics.endFill();
AnalogClok.filters = [Glow, Shadow];
stage.addChild(AnalogClok);
}
function CreateClockWise(ClockWiseName, WiseColor, Length, Width):void {
ClockWiseArray[ClockWiseName] = new MovieClip();
ClockWiseArray[ClockWiseName].graphics.lineStyle(2, 0x000000, 1);
var BodyMatrix:Matrix = new Matrix(1, 0, 0, 1, 0, 0);
BodyMatrix.createGradientBox(2 * Width, Length, 0, -Width, 0);
ClockWiseArray[ClockWiseName].graphics.beginGradientFill(“linear”, [0xaaaaaa, WiseColor, 0xaaaaaa], [1, 1, 1], [40, 128, 215], BodyMatrix, “repeat”, “rgb”, 0);
ClockWiseArray[ClockWiseName].graphics.drawEllipse(-Width / 2, 0, Width, -Length);
ClockWiseArray[ClockWiseName].graphics.drawCircle(0, -Length, Width);
ClockWiseArray[ClockWiseName].graphics.endFill();
ClockWiseArray[ClockWiseName].x = 275;
ClockWiseArray[ClockWiseName].y = 200;
ClockWiseArray[ClockWiseName].filters = [Shadow];
stage.addChild(ClockWiseArray[ClockWiseName]);
}
var ClockWiseArray:Array = new Array();
CreateClockWise(“HoursWise”, 0x0000ff, 80, 30);
CreateClockWise(“MinutesWise”, 0x00ff00, 110, 20);
CreateClockWise(“SecondsWise”, 0xff0000, 140, 10);
var FastTimer:Timer = new Timer(30);
FastTimer.addEventListener(TimerEvent.TIMER, ShowTime);
FastTimer.start();
function ShowTime(event:TimerEvent):void {
Now = new Date();
DigitalClock.text = Now.date > 9 ? String(Now.date) + “.”: “0” + String(Now.date) + “.”;
Now.month + 1 > 9 ? DigitalClock.appendText(String(Now.month + 1)): DigitalClock.appendText(“0” + String(Now.month + 1));
DigitalClock.appendText(“.” + Now.fullYear + “. “);
Now.hours > 9 ? DigitalClock.appendText(String(Now.hours) + “:”): DigitalClock.appendText(“0” + String(Now.hours) + “:”);
Now.minutes > 9 ? DigitalClock.appendText(String(Now.minutes) + “:”): DigitalClock.appendText(“0” + String(Now.minutes) + “:”);
Now.seconds > 9 ? DigitalClock.appendText(String(Now.seconds)): DigitalClock.appendText(“0” + String(Now.seconds));
Now.hours > 12 ? ClockWiseArray[“HoursWise”].rotation = (Now.hours – 12) * 360 / 12: ClockWiseArray[“HoursWise”].rotation = Now.hours * 360 / 12;
ClockWiseArray[“HoursWise”].rotation += Now.minutes / 60 * 360 / 12;
ClockWiseArray[“MinutesWise”].rotation = Now.minutes * 360 / 60 + Now.seconds / 60 * 360 / 60;
ClockWiseArray[“SecondsWise”].rotation = Now.seconds * 360 / 60;
event.updateAfterEvent();
}
Događaji vezani za tastaturu mogu pratiti pritisak tastera i otpuštanje testera. Kada se desi ovakav događaj, Flash šalje informaciju u kojoj su podaci o tome koji je taster u pitanju, funkciji koja je navedena.
import flash.events.KeyboardEvent;
import flash.text.TextField;
var ShowTextField:TextField = new TextField();
ShowTextField.width = stage.stageWidth;
ShowTextField.height = stage.stageHeight;
stage.addChild(ShowTextField);
ShowTextField.addEventListener(KeyboardEvent.KEY_DOWN, KeyIsPressed);
function KeyIsPressed(event:KeyboardEvent):void {
ShowTextField.text = event.charCode.toString();
ShowTextField.appendText(“\nkeyDownHandler: ” + event.keyCode);
ShowTextField.appendText(“\nctrlKey: ” + event.ctrlKey);
ShowTextField.appendText(“\nkeyLocation: ” + event.keyLocation);
ShowTextField.appendText(“\nshiftKey: ” + event.shiftKey);
// ShowTextField.appendText(“\naltKey: ” + event.altKey.toString()); // Error
}
Isti je postupak i za pisanje koda za događaj kada se taster pusti:
SomeTextField.addEventListener(KeyboardEvent.KEY_UP, KeyIsReleased);
Primer 4: Pomeranje objekta strelicama!
import flash.text.TextField;
import flash.events.KeyboardEvent;
import flash.display.MovieClip;
var KeyTarget:MovieClip = new MovieClip();
KeyTarget.graphics.lineStyle(2, 0x000000, 1);
KeyTarget.graphics.beginFill(0xff00ff, 1);
KeyTarget.graphics.drawCircle(0, 0, 30);
KeyTarget.graphics.endFill();
KeyTarget.x = 275;
KeyTarget.y = 200;
stage.addChild(KeyTarget);
var Left:int = 0;
var Right:int = 0;
var Up:int = 0;
var Down:int = 0;
var InputField:TextField = new TextField();
InputField.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
InputField.addEventListener(KeyboardEvent.KEY_UP, KeyUp);
function KeyDown(event:KeyboardEvent):void {
switch(event.keyCode) {
case 37:
Left = 1;
break;
case 39:
Right = 1;
break;
case 38:
Up = 1;
break;
case 40:
Down = 1;
break;
default:
break;
}
}
function KeyUp(event:KeyboardEvent):void {
switch(event.keyCode) {
case 37:
Left = 0;
break;
case 39:
Right = 0;
break;
case 38:
Up = 0;
break;
case 40:
Down = 0;
break;
default:
break;
}
}
var FastTimer:Timer = new Timer(20);
FastTimer.addEventListener(TimerEvent.TIMER, StageFocus);
FastTimer.start();
function StageFocus(event:TimerEvent):void {
stage.focus = InputField;
InputField.text = “”;
KeyTarget.x += Right – Left;
KeyTarget.y += Down – Up;
event.updateAfterEvent();
}
U ovom primeru je pokazano lako razumljivo kodiranje za pamćenje svakog tastera posebno, i to je iskorišćeno za koso pomeranje objekta.
Primer klika levim tasterom miša na ’stage’ je najprostiji za shvatanje korišćenja događaja. Informacije koje se ovde šalju su i pozicija miša na objektu preko koga je kliknuto.
import flash.events.*;
stage.addEventListener(MouseEvent.CLICK, ClickOnStage);
function ClickOnStage(event:MouseEvent):void {
trace(“New click.”);
trace(“x=” + stage.mouseX + ” y=” + stage.mouseY);
}
Ovo je očigledan primer kako se izvršavaju događaji. Kada ponovo kliknete na ’stage’ funkcija će se ponovo izvršiti. Ako želite da se ne izvršava ponovo potrebno je isključiti osluškivač, kao u sledećim linijama.
import flash.events.*;
stage.addEventListener(MouseEvent.CLICK, ClickOnStage);
function ClickOnStage(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.CLICK, ClickOnStage);
trace(“Event is removed.”);
}
Događaji koje inicira miš su mnogobrojni. Moguć je klik mišem ’CLICK’ na neki objekt, pritisak dugmeta ’MOUSE_DOWN’, otpuštanje dugmeta ’MOUSE_UP’, pomeranje miša ’MOUSE_MOVE’, rotiranje točkića ’MOUSE_WHELL’ preko objekta, dolazak kursora preko objekta ’MOUSE_OVER’ i ’ROLL_OVER’, izlazak kursora van objekta ’MOUSE_OUT’ i ’ROLL_OUT’, i dvostruki klik mišem preko objekta ’DOUBLE_CLICK’. Na primeru se vidi kako se koriste neki od događaja, čija se izvršne funkcije odnose na menjanje izgleda kruga. Pored ovih moguće je kontrolisati i klik na centralni i desni taster miša.
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.filters.DropShadowFilter;
var CurrentColor:uint = 0x000000;
var CurrentSize:int = 100;
var Shadow:DropShadowFilter = new DropShadowFilter(10, 45, 0x888888, 0.5);
var Circle:Sprite = new Sprite();
Circle.x = Circle.y = 200;
Circle.graphics.beginFill(0x000000);
Circle.graphics.drawCircle(0, 0, CurrentSize);
Circle.graphics.endFill();
Circle.doubleClickEnabled = true;
stage.addChild(Circle);
Circle.addEventListener(MouseEvent.CLICK, ChangeColor);
Circle.addEventListener(MouseEvent.MOUSE_WHEEL, ChangeSize);
Circle.addEventListener(MouseEvent.DOUBLE_CLICK, Animation);
Circle.addEventListener(MouseEvent.MOUSE_OUT, RemoveShadow);
Circle.addEventListener(MouseEvent.MOUSE_OVER, ShowShadow);
function ChangeColor(event:MouseEvent):void {
CurrentColor = Math.random() * 256 * 256 * 256;
Circle.graphics.clear();
Circle.graphics.beginFill(CurrentColor);
Circle.graphics.drawCircle(0, 0, CurrentSize);
Circle.graphics.endFill();
}
function ChangeSize(event:MouseEvent):void {
CurrentSize += event.delta; // default: event.delta = 3
Circle.graphics.clear();
Circle.graphics.beginFill(CurrentColor);
Circle.graphics.drawCircle(0, 0, CurrentSize);
Circle.graphics.endFill();
}
function Animation(event:MouseEvent):void {
Circle.x += 10;
}
function RemoveShadow(event:MouseEvent):void {
Circle.filters = [];
}
function ShowShadow(event:MouseEvent):void {
CurrentColor = Math.random() * 256 * 256 * 256;
Circle.filters = [Shadow];
}
Primer 5: Pogađanje slučajnog celog broja od 1 do 99!
import flash.display.*;
import flash.text.*;
var AllTextFormat:TextFormat = new TextFormat(“Geogia”, 20, 0x000000, true, false, false, null, null, TextFieldAutoSize.CENTER, null, null, null, null);
var StaticTextField:TextField = new TextField();
StaticTextField.x = 100;
StaticTextField.y = 50;
StaticTextField.width = 350;
StaticTextField.height = 50;
StaticTextField.defaultTextFormat = AllTextFormat;
StaticTextField.text = “Click on stage to start…”;
stage.addChild(StaticTextField);
var AnswerTextField:TextField = new TextField();
AnswerTextField.x = 100;
AnswerTextField.y = 250;
AnswerTextField.width = 350;
AnswerTextField.height = 150;
AnswerTextField.multiline = true;
AnswerTextField.defaultTextFormat = AllTextFormat;
stage.addChild(AnswerTextField);
var InputTextField:TextField = new TextField();
InputTextField.x = 225;
InputTextField.y = 150;
InputTextField.width = 100;
InputTextField.height = 50;
InputTextField.border = true;
InputTextField.borderColor = 0x0000ff;
InputTextField.defaultTextFormat = AllTextFormat;
InputTextField.restrict = “0-9”;
InputTextField.maxChars = 2;
InputTextField.type = TextFieldType.INPUT;
stage.addChild(InputTextField);
var MyNumber:int;
var YourMove:int;
stage.addEventListener(MouseEvent.CLICK, Start);
function Start(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.CLICK, Start);
MyNumber = int(Math.random() * 98.99 + 1);
YourMove = 0;
StaticTextField.text = “Find my random number (1-99)!”;
InputTextField.text = “?”;
AnswerTextField.text = “Insert number in box…\n And press ‘ENTER’…”;
InputTextField.addEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler);
}
function KeyDownHandler(event:KeyboardEvent):void {
if(event.keyCode == 13) {
CheckAnswer();
}
}
function CheckAnswer():void {
YourMove ++;
AnswerTextField.text = “Move: ” + String(YourMove) + ” => ” + InputTextField.text + “\n”;
if(int(InputTextField.text) == MyNumber) {
InputTextField.removeEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler);
AnswerTextField.appendText(“Bravo!\nYou have found my number…”);
StaticTextField.text = “Click on stage to play again…”;
stage.addEventListener(MouseEvent.CLICK, Start);
}
else {
if(int(InputTextField.text) < MyNumber) {
AnswerTextField.appendText(“My number is greater than ” + InputTextField.text + “\nTry again…”);
}
else {
AnswerTextField.appendText(“My number is less than ” + InputTextField.text + “\nTry again…”);
}
}
}
Zapamtite da kada radite bilo koji program, kada završite sa nekim događajem obavezno isključite njegov osluškivač. Ako ovo zaboravite mogu nastati greške koje se obično javljaju kada se isti delovi programa pozivaju više puta.
U ovom primeru je ostvaren naizmenični transfer informacija između korisnika i programa, što vezuje korisnika da posveti neko vreme ovom programu. Međutim dizajn je veoma loš, tako da ako želimo da ukrasimo naše animacije, potrebno je da savladamo filtere i rad sa simbolima za početak.
FLASH MAHER!
FLASH MAHER – UVOD!
FLASH MAHER – OSNOVNI PODACI!
FLASH MAHER – OPERATORI I USLOVNE NAREDBE!
FLASH MAHER – FUNKCIJE!
FLASH MAHER – DOGAĐAJI!
FLASH MAHER – FILTERI!
FLASH MAHER – GRAFIKA!
FLASH MAHER – MASKA!
FLASH MAHER – ANIMACIJA!
FLASH MAHER – OPP – OBJEKTNO ORIJENTISANO PROGRAMIRANJE!
FLASH MAHER – FLASH I PHP!
VojaMaher