Arbeta med objekt

ActionScript är ett så kallat objektorienterat programmeringsspråk. Objektorienterad programmering är ett sätt att programmera. Det är helt enkelt ett sätt att ordna kod i ett program med hjälp av objekt.

Termen program definierades tidigare som en rad steg eller instruktioner som datorn utför. Du kan alltså se ett program som en enda lång lista med instruktioner. I objektorienterad programmering delas programinstruktionerna dock upp mellan olika objekt. Koden grupperas i funktionsgrupper, så att liknande funktioner eller information grupperas tillsammans i en behållare.

Adobe Flash Professional

Om du har arbetat med symboler i Flash Professional är du redan bekant med objekt. Låt oss anta att du har definierat en filmklippssymbol, till exempel en ritning av en rektangel, och du har placerat en kopia av den på scenen. Denna filmklippssymbol är också (bokstavligen) ett objekt i ActionScript. Det är en instans av klassen MovieClip.

Det finns flera egenskaper för filmklippet som du kan ändra. När det är markerat kan du ändra värdena i egenskapsinspektören, till exempel dess x-koordinat eller dess bredd. Du kan också göra olika färgjusteringar, som att ändra alfa (genomskinlighet) eller lägga till ett skuggfilter. Med andra Flash Professional-verktyg kan du göra fler ändringar, till exempel använda verktyget Omforma fritt för att rotera rektangeln. Alla de här sätten att ändra en filmklippssymbol i Flash Professional finns också i ActionScript. Du ändrar filmklippet i ActionScript genom att ändra de data som alla sammanförs i ett enda paket som kallas ett MovieClip-objekt.

I objektorienterad programmering i ActionScript finns det tre typer av egenskaper som alla klasser kan innehålla:

  • Egenskaper

  • Metoder

  • Händelser

Dessa element används för att hantera de datadelar som används av programmet och för att bestämma vilka åtgärder som ska utföras och i vilken ordning.

Egenskaper

En egenskap representerar en av de datadelar som har paketerats till ett objekt. Ett exempelsångobjekt kan ha egenskaperna artist och title; klassen MovieClip har egenskaper som rotation, x, width och alpha. Du arbetar med egenskaper precis som med enskilda variabler. Vid närmare eftertanke kan du faktiskt tänka på egenskaper som underordnade variabler som finns i ett objekt.

Här är några exempel på ActionScript-kod som innehåller egenskaper. Den här kodraden flyttar ett filmklipp som heter square till x-koordinaten 100 pixlar:

square.x = 100;

I den här koden används egenskapen rotation för att rotera filmklippet square så att det stämmer överens med rotationen för filmklippet triangle:

square.rotation = triangle.rotation;

Den här koden ändrar den horisontella skalan för filmklippet square, så att det blir en och en halv gång så brett som det var tidigare:

square.scaleX = 1.5;

Observera den vanliga strukturen: du använder en variabel (square, triangle) som namn på objektet, följt av en punkt (.) och sedan namnet på egenskapen (x, rotation, scaleX). Punkten, som också kallas punktoperatorn används för att ange att du öppnar ett av objektets underordnade element. Hela strukturen, ”variabelnamn-punkt-egenskapsnamn”, används som en enda variabel, som namn på ett enstaka värde i datorns minne.

Metoder

En metod är en åtgärd som ett objekt kan utföra. Anta till exempel att du har skapat en filmklippssymbol i Flash Professional med flera nyckelrutor och animering på tidslinjen. Det filmklippet kan spelas upp, stoppas eller instrueras att flytta spelhuvudet till en viss bildruta.

I den här koden instrueras filmklippet shortFilm att starta uppspelningen:

shortFilm.play();

Den här raden gör att filmklippet shortFilm avbryter uppspelningen (spelhuvudet stoppar på stället, som när en video pausar):

shortFilm.stop();

Den här koden gör att filmklippet shortFilm flyttar spelhuvudet till Bildruta 1 och stoppar uppspelningen (som när en video spolar tillbaka):

shortFilm.gotoAndStop(1);

Du får alltså tillgång till metoder på samma sätt som egenskaper, d.v.s. genom att skriva objektets namn (en variabel), följt av en punkt och sedan namnet på metoden följt av parenteser. Med parenteserna anger du att du anropar metoden eller, med andra ord, instruerar objektet att utföra åtgärden. Ibland placeras värden (eller variabler) inom parenteserna för att skicka ytterligare information som behövs för att åtgärden ska kunna utföras. Dessa värden kallas metodparametrar. Metoden gotoAndStop() behöver till exempel information om vilken bildruta den ska gå till, och därför krävs en parameter inom parenteserna. Andra metoder, som play() och stop(), är självförklarande och behöver ingen extra information. De skrivs dock fortfarande inom parentes.

I motsats till egenskaper (och variabler) används metoder inte som platshållare för värden. Vissa metoder kan emellertid utföra beräkningar och returnera ett resultat som kan användas som en variabel. Exempel: Med metoden toString() för klassen Number konverteras det numeriska värdet till en textbeteckning:

var numericData:Number = 9; 
var textData:String = numericData.toString();

Du använder till exempel metoden toString() om du vill visa värdet på en Number-variabel i ett textfält på skärmen. Egenskapen text för klassen TextField definieras som en sträng (String), så den kan bara innehålla textvärden. (Texten property representerar själva textinnehållet som visas på skärmen.) Den här kodraden konverterar det numeriska värdet i variabeln numericData till text. Sedan skickas värdet till skärmen, där det visas i det TextField-objekt som heter calculatorDisplay:

calculatorDisplay.text = numericData.toString();

Händelser

Ett program är en serie instruktioner som datorn utför steg för steg. Vissa enkla program består bara av ett fåtal steg som datorn utför, och sedan avslutas programmet. ActionScript-program fortsätter emellertid att köra och väntar på att användaren matar in något eller att något annat händer. Händelser är den mekanism som avgör vilka instruktioner datorn utför och när.

Händelser är alltså saker som händer och som ActionScript identifierar och kan svara på. Många händelser rör användarinteraktion, till exempel att användaren klickar på en knapp eller trycker på en tangent. Det finns även andra typer av händelser. Om du till exempel använder ActionScript för att läsa in en extern bild finns det en händelse, som du kan använda för att få veta när bilden har lästs in. När ett ActionScript-program körs väntar det i princip bara på att vissa saker ska hända. När dessa saker händer körs den specifika ActionScript-kod som du har angett för de händelserna.

Grundläggande händelsehantering

Tekniken för att ange att vissa åtgärder ska utföras som svar på andra händelser kallas händelsehantering. När du skriver ActionScript-kod för att utföra händelsehantering, finns det tre viktiga element som du måste identifiera:

  • Händelsekällan: Vilket objekt är det som händelsen ska reagera på? Det kan till exempel vara den knapp användaren klickar på eller det Loader-objekt som ska läsa in bilden. Händelsekällan kallas även händelsemål. Den har fått det här namnet eftersom källan är målet för händelsen (d.v.s. där händelsen sker).

  • Händelsen: Vad är det som kommer att hända, den sak som du vill svara på? Det är viktigt att identifiera den specifika händelsen, eftersom många objekt utlöser flera händelser.

  • Svaret: Vilka åtgärder ska utföras när händelsen inträffar?

När du skriver ActionScript-kod som ska hantera händelser är dessa tre element nödvändiga. Koden följer den här grundläggande strukturen (element i fet stil är platshållare som du fyller i efter behov):

function eventResponse(eventObject:EventType):void 
{ 
    // Actions performed in response to the event go here. 
} 
  
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

Den här koden gör två saker. Först definieras en funktion, vilket är ett sätt att ange de åtgärder som ska utföras som svar på händelsen. Därefter anropas metoden addEventListener() för källobjektet. Det här anropet till addEventListener() innebär i princip att funktionen ”prenumererar” på den angivna händelsen. När händelsen inträffar utförs funktionens åtgärder. Vi ska beskriva dessa delar mer ingående.

Med en funktion kan du gruppera flera åtgärder med ett enda namn, som fungerar som en genväg till åtgärderna. En funktion är samma sak som en metod, men med den skillnaden att den inte nödvändigtvis är kopplad till en viss klass. (Termen ”metod” kan faktiskt definieras som en funktion som är kopplad till en särskild klass.) När du skapar en funktion för händelsehantering väljer du ett namn för funktionen (i det här fallet eventResponse). Du anger också en parameter (i det här exemplet eventObject). Att ange en funktionsparameter är som att deklarera en variabel, och du måste också ange parameterns datatyp. (I det här exemplet är parameterns datatyp EventType.)

Alla typer av händelser som du vill avlyssna måste ha en ActionScript-klass kopplad till sig. Datatypen som du anger för funktionsparametern är alltid den klass som kopplas till händelsen som du vill svara på. En click-händelse (utlöses när användaren klickar på ett objekt med musen) kopplas till exempel till klassen MouseEvent. Om du vill skriva en avlyssnarfunktion för en click-händelse definierar du avlyssnarfunktionen med en parameter med datatypen MouseEvent. Mellan den inledande och avslutande klammerparentesen ({ ... }) skriver du de instruktioner som du vill att datorn ska utföra när händelsen inträffar.

Nu har du skrivit händelsehanteringsfunktionen. Härnäst ska du tala om för händelsekällobjektet (det objekt som händelsen utförs på, till exempel knappen) att det ska anropa din funktion när händelsen inträffar. Du registrerar funktionen hos händelsekällobjektet genom att anropa metoden addEventListener() för det objektet (alla objekt som har händelser har också en addEventListener()-metod). Metoden addEventListener() används med två parametrar:

  • Först namnet på den speciella händelse som du vill svara på. Varje händelse är kopplad till en viss klass. Varje händelseklass har ett visst värde (som fungerar som ett unikt namn) definierat för var och en av dess händelser. Du använder det värdet för den första parametern.

  • Sedan namnet på händelsens svarsfunktion. Observera att ett funktionsnamn skrivs utan parenteser när det skickas som en parameter.

Händelsehanteringsprocessen

Följande är en stegvis beskrivning av den process som inträffar när du skapar en händelseavlyssnare. I det här fallet visas ett exempel på hur du skapar en avlyssnarfunktion som anropas när objektet myButton klickas.

Den aktuella koden som skrivs av programmet är:

function eventResponse(event:MouseEvent):void 
{ 
    // Actions performed in response to the event go here. 
} 
 
myButton.addEventListener(MouseEvent.CLICK, eventResponse);

Så här fungerar koden när den körs:

  1. När SWF-filen läses in identifieras funktionen eventResponse() av datorn.

  2. Koden körs då (närmare bestämt de kodrader som inte finns i en funktion). I det här fallet är det bara en kodrad: anropa metoden addEventListener() för händelsekällobjektet (som heter myButton) och skicka funktionen eventResponse som en parameter.

    Internt har myButton en lista över funktioner som lyssnar på var och en av dess händelser. När dess addEventListener()-metod anropas sparar myButton funktionen eventResponse() i sin lista över händelseavlyssnare.

  3. I ett visst läge klickar användaren på objektet myButton vilket utlöser händelsen click (identifieras som MouseEvent.CLICK i koden).

    I det läget händer följande:

    1. Ett objekt, som är en instans av den klass som är kopplad till den aktuella händelsen (MouseEvent i det här exemplet), skapas. För många händelser är det här objektet en instans av klassen Event. För mushändelser är det en MouseEvent-instans. För andra händelser är det en instans av den klass som är koppad till händelsen. Objektet som skapas kallas händelseobjekt och innehåller speciell information om händelsen som inträffade: vilken typ av händelse det är, var den inträffade och annan händelsespecifik information.

    2. Datorn letar sedan i listan över händelseavlyssnare som sparas av myButton. Varje funktion gås igenom en i taget, varje funktion anropas och händelseobjektet skickas till funktionen som en parameter. Eftersom funktionen eventResponse() är en avlyssnare till myButton anropar datorn funktionen eventResponse() som en del av den här processen.

    3. När funktionen eventResponse() anropas körs koden i funktionen, så att dina angivna åtgärder utförs.

Exempel på händelsehantering

Nedan följer några mer konkreta exempel på kod för händelsehantering. Dessa exempel ger dig förhoppningsvis en bild av en del vanliga händelseelement och olika varianter som du kan prova när du skriver händelsehanteringskod:

  • Klicka på en knapp för att starta uppspelningen av aktuellt filmklipp. I följande exempel är playButton instansnamn på knappen och this är ett specialnamn som betyder ”aktuellt objekt”:

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • Identifiera skrift i ett textfält. I det här exemplet är entryText ett inmatningsfält och outputText ett dynamiskt textfält:

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • Klicka på en knapp för att gå till en URL. I det här fallet är linkButton instansnamnet på knappen:

    function gotoAdobeSite(event:MouseEvent):void 
    { 
        var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); 
        navigateToURL(adobeURL); 
    } 
     
    linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

Skapa objektinstanser

Innan du kan använda ett objekt i ActionScript måste det naturligtvis finnas till. En del av att skapa ett objekt är att deklarera en variabel, men detta skapar bara en tom plats i datorns minne. Tilldela alltid variabeln ett verkligt värde (d.v.s. skapa ett objekt och lagra det i variabeln) innan du försöker använda eller hantera den. Själva processen att skapa ett objekt kallas även att instansiera objektet. Du skapar med andra ord en instans av en viss klass.

Ett enkelt sätt att skapa en objektinstans inbegriper inte ActionScript alls. I Flash Professional placerar du en filmklippssymbol eller ett textfält på scenen och tilldelar det ett instansnamn. En variabel med det instansnamnet deklareras då automatiskt i Flash Professional, en objektinstans skapas och objektet sparas i variabeln. På ett liknande sätt skapar du i Flex en komponent i MXML genom att koda en MXML-tagg eller genom att placera komponenten i redigeraren i designläget i Flash Builder. När du tilldelar ett ID till komponenten blir det ID:t namnet på en ActionScript-variabel som innehåller den komponentinstansen.

Men du vill kanske inte alltid skapa ett objekt visuellt, och för icke-visuella objekt kan du inte göra det. Du kan skapa objektinstanser på flera andra sätt enbart med ActionScript.

Med flera olika ActionScript-datatyper kan du skapa en instans med hjälp av ett literaluttryck, ett värde som skrivs direkt i ActionScript-koden. Här är några exempel:

  • Literalt numeriskt värde (ange talet direkt):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • Literalt strängvärde (omge texten med citattecken):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • Literalt booleskt värde (använd de literala värdena true eller false):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • Literalt Array-värde (radbryt en kommaavgränsad lista med värden inom hakparentes):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • Literalt XML-värde (ange XML direkt):

    var employee:XML = <employee> 
            <firstName>Harold</firstName> 
            <lastName>Webster</lastName> 
        </employee>;

I ActionScript definieras literala uttryck för datatyperna Array, RegExp, Object och Function.

Det vanligaste sättet att skapa en instans för en datatyp är att använda operatorn new med klassnamnet, enligt nedanstående:

var raceCar:MovieClip = new MovieClip(); 
var birthday:Date = new Date(2006, 7, 9);

Att skapa ett objekt med hjälp av operatorn new beskrivs ofta som att ”anropa klassens konstruktor”. En konstruktor är en speciell metod som anropas som en del av processen med att skapa en instans av en klass. Tänk på att du sätter parenteser efter klassnamnet när du skapar en instans på det här sättet. Ibland anger du parametervärden innanför parenteserna. Det finns två saker som du också gör när du anropar en metod.

Du kan använda operatorn new för att skapa en objektinstans även för sådana datatyper, som medger att du skapar instanser med hjälp av literala uttryck. De här två kodraderna gör till exempel exakt samma sak:

var someNumber:Number = 6.33; 
var someNumber:Number = new Number(6.33);

Det är viktigt att du känner till hur du skapar objekt med new ClassName(). Många ActionScript-datatyper kan inte representeras visuellt. De kan därför inte heller skapas genom att du placerar ett objekt på scenen i Flash Professional eller via designläget i MXML-redigeraren i Flash Builder. Du kan bara skapa en instans av sådana datatyper i ActionScript med operatorn new.

Adobe Flash Professional

I Flash Professional kan operatorn new också användas för att skapa en instans av en filmklippssymbol, som har definierats i biblioteket men inte placerats på scenen.