Werken met objecten

ActionScript is een zogenaamde objectgeoriënteerde programmeertaal. Objectgeoriënteerd programmeren is gewoon een manier van programmeren. Het is eigenlijk niets anders dan een manier om de code met behulp van objecten in een programma te organiseren.

De term 'computerprogramma' werd eerder gedefinieerd als een reeks stappen of instructies die een computer uitvoert. In dat geval kan een computerprogramma worden voorgesteld als een enkele, lange lijst van instructies. In objectgeoriënteerde programmering worden de programma-instructies verdeeld over verschillende objecten. De code wordt gegroepeerd in gedeeltes van de functionaliteit, zodat gerelateerde functionaliteitstypen of gerelateerde informatietypen in één container worden gegroepeerd.

Adobe Flash Professional

Als u al eerder in Flash Professional met symbolen hebt gewerkt, bent u al gewend aan het werken met objecten. Stel dat u een filmclipsymbool hebt gedefinieerd, bijvoorbeeld een tekening van een rechthoek, en een kopie ervan in het werkgebied hebt geplaatst. Dit filmclipsymbool is ook (letterlijk) een object in ActionScript. Het is een instantie van de klasse MovieClip.

Er zijn verschillende kenmerken van de filmclip die u kunt wijzigen. Wanneer de filmclip is geselecteerd, kunt u in de Eigenschappencontrole waarden zoals het x-coördinaat of de breedte wijzigen. U kunt ook verschillende kleuraanpassingen uitvoeren, zoals het wijzigen van de alfa (transparantie) of het toepassen van een schaduwfilter. Met andere Flash Professional-gereedschappen kunt u meer wijzigingen doorvoeren. U kunt bijvoorbeeld met het gereedschap Vrije transformatie de rechthoek roteren. Al deze manieren om een filmclipsymbool aan te passen in Flash Professional zijn ook beschikbaar in ActionScript. U kunt de filmclip in ActionScript aanpassen door gedeelten informatie te wijzigen samen worden gebracht in één Filmclipobject.

Bij objectgeoriënteerd programmeren in ActionScript zijn er drie typen kenmerken die elke klasse kan bevatten:

  • Eigenschappen

  • Methoden

  • Gebeurtenissen

Deze elementen dienen om de gegevens te beheren die door het programma worden gebruikt en te bepalen welke handelingen worden uitgevoerd en in welke volgorde.

Eigenschappen

Een eigenschap vertegenwoordigt één van de gegevens die zijn samengebracht in een object. Een Songobject heeft bijvoorbeeld de eigenschappen artist en title . De klasse MovieClip kan eigenschappen als rotation , x , width en alpha hebben. Eigenschappen worden als individuele variabelen behandeld. Een andere manier om eigenschappen te omschrijven is als de 'onderliggende' variabelen in een object.

Hieronder volgen enkele voorbeelden van ActionScript-code waarin gebruik wordt gemaakt van eigenschappen. De volgende coderegel verplaatst de MovieClip met de naam square naar 100 pixels op de x-coördinaat:

square.x = 100;

De volgende code gebruikt de eigenschap rotation om de MovieClip square te roteren zodat de rotatie gelijk wordt aan die van de MovieClip triangle :

square.rotation = triangle.rotation;

De volgende code wijzigt de horizontale schaal van de MovieClip square zodat deze anderhalf keer breder wordt:

square.scaleX = 1.5;

Let op de gemeenschappelijke structuur: u gebruikt een variabele ( square , triangle ) als naam van het object, gevolgd door een punt ( . ) en vervolgens de naam van de eigenschap ( x , rotation , scaleX ). De punt, die puntoperator wordt genoemd, wordt gebruikt om aan te geven dat u een van de onderliggende elementen van een object benadert. De gehele structuur samen, ‘variabelenaam-punt-eigenschapnaam’, wordt gebruikt als een enkele variabele, dus als een naam voor een enkele waarde in het computergeheugen.

Methoden

Een methode is een actie die door een object kan worden uitgevoerd. U hebt bijvoorbeeld een filmclipsymbool gemaakt in Flash Professional met op de tijdslijn meerdere hoofdframes en animatie. Deze filmclip kan worden afgespeeld of gestopt of kan worden verteld om de afspeelkop naar een bepaald frame te verplaatsen.

De volgende coderegel zorgt ervoor dat de MovieClip met de naam shortFilm begint met afspelen:

shortFilm.play();

De volgende coderegel zorgt ervoor dat de MovieClip met de naam shortFilm stopt met afspelen (de afspeelkop blijft op zijn plaats, zoals bij het pauzeren van een video):

shortFilm.stop();

De volgende coderegel zorgt ervoor dat de afspeelkop van de MovieClip met de naam shortFilm wordt verplaatst naar frame 1 en stopt met afspelen (zoals bij het terugspoelen van een video):

shortFilm.gotoAndStop(1);

Methoden worden, net zoals eigenschappen, benaderd door de naam van het object (een variabele) te schrijven, gevolgd door een punt en de naam van de methode met haakjes erachter. Met de haakjes geeft u aan dat u de methode aanroept , met andere woorden, het object de instructie geeft een bepaalde handeling uit te voeren. Soms worden waarden (of variabelen) tussen haakjes geplaatst om aanvullende informatie door te geven die nodig is om de handeling uit te voeren. Deze waarden worden de parameters van een methode genoemd. De methode gotoAndStop() moet bijvoorbeeld weten naar welk frame moet worden gegaan en heeft dus een enkele parameter tussen de haakjes nodig. Andere methoden, zoals play() en stop() behoeven geen uitleg en hebben dus geen aanvullende informatie nodig. Deze methoden worden echter wel met haakjes geschreven.

In tegenstelling tot eigenschappen (en variabelen), worden methoden niet gebruikt als plaatsaanduidingen voor waarden. Sommige methoden kunnen echter berekeningen uitvoeren en een resultaat retourneren dat kan worden gebruikt als een variabele. De methode toString() van de klasse Number zet bijvoorbeeld een numerieke waarde om in de bijbehorende tekstrepresentatie:

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

U kunt de methode toString() bijvoorbeeld gebruiken wanneer u de waarde van een variabele Getal wilt weergeven in een tekstveld op het scherm. De eigenschap text van de klasse TextField wordt gedefinieerd als een String, zodat deze alleen tekstwaarden kan bevatten. (De tekst property vertegenwoordigt de werkelijke tekstinhoud die op het scherm wordt weergegeven.) Deze coderegel zet de numerieke waarde in de variabele numericData om in tekst. De waarde wordt vervolgens weergegeven op het venster in het TextField-object calculatorDisplay :

calculatorDisplay.text = numericData.toString();

Gebeurtenissen

Hierboven is een computerprogramma beschreven als een serie instructies die de computer stapsgewijs uitvoert. Sommige eenvoudige computerprogramma’s bestaan inderdaad uit niets meer dan dat: een paar stappen die worden uitgevoerd door de computer, waarna het programma stopt. ActionScript-programma’s zijn echter ontworpen om continu te worden uitgevoerd, terwijl wordt gewacht op gebruikersinvoer of iets anders. Gebeurtenissen vormen het mechanisme waarmee wordt bepaald welke instructies de computer uitvoert en wanneer.

In wezen is een gebeurtenis een voorval dat bekend is bij ActionScript en waarop gereageerd kan worden. Veel gebeurtenissen zijn gerelateerd aan gebruikersinteractie, zoals een gebruiker die op een knop klikt of op een toets op het toetsenbord drukt. Er zijn ook andere gebeurtenistypen. Wanneer u ActionScript bijvoorbeeld gebruikt om een externe afbeelding te laden, bestaat er een gebeurtenis die u kan waarschuwen wanneer de afbeelding is geladen. Wanneer er een ActionScript-programma wordt uitgevoerd, wacht het eigenlijk tot er een aantal dingen gebeuren. Wanneer die dingen gebeuren, wordt de ActionScript-code uitgevoerd, die u voor die gebeurtenissen hebt opgegeven.

Standaardgebeurtenisafhandeling

De techniek voor het opgeven van bepaalde handelingen die moeten worden uitgevoerd als reactie op specifieke gebeurtenissen, wordt gebeurtenisafhandeling genoemd. Wanneer u ActionScript-code schrijft om gebeurtenisafhandeling uit te voeren, zijn er drie belangrijke elementen die u moet identificeren:

  • De gebeurtenisbron: het object waarop de gebeurtenis betrekking heeft. Voorbeelden zijn de knop waarop wordt geklikt of het object Loader dat de afbeelding laadt. De gebeurtenisbron wordt ook wel het gebeurtenisdoel genoemd. Deze wordt zo genoemd, omdat dit het object is waarop de computer de gebeurtenis richt (waar de gebeurtenis echt plaatsvindt).

  • De gebeurtenis: het voorval waarop u wilt reageren. Het is belangrijk om deze gebeurtenis te identificeren, aangezien veel objecten meerdere gebeurtenissen activeren.

  • De reactie: de stappen die u wilt uitvoeren wanneer de gebeurtenis plaatsvindt.

Wanneer u ActionScript-code wilt schrijven om gebeurtenissen uit te voeren, hebt u deze drie elementen nodig. De code volgt een basisstructuur (elementen in vetgedrukte letters zijn voorbeelden die u invult voor geval):

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

In deze code gebeuren twee dingen. Eerst wordt een functie gedefinieerd, waarin de handelingen worden opgegeven die u wilt uitvoeren als reactie op de gebeurtenis. Vervolgens wordt de methode addEventListener() van het bronobject opgeroepen. Wanneer u addEventListener() oproept, wordt de functie aan een bepaalde gebeurtenis 'toegeschreven'. Wanneer de gebeurtenis plaatsvindt, worden de acties van de functie uitgevoerd. Hieronder worden deze onderdelen nader beschreven.

Met een functie kunt u handelingen groeperen onder een enkele naam, die fungeert als een soort snelkoppeling om de handelingen uit te voeren. Een functie is identiek aan een methode, behalve dat deze niet noodzakelijk aan een bepaalde klasse is gerelateerd. (De term “methode” kan worden gedefinieerd als een functie die gerelateerd is aan een bepaalde klasse.) Wanneer u een functie maakt voor het uitvoeren van een gebeurtenis, kiest u een naam voor deze functie (in dit geval eventResponse ). U kunt ook één parameter opgeven (in dit voorbeeld eventObject ). Het opgeven van een functieparameter lijkt op het declareren van een variabele. U moet dus ook het gegevenstype van de parameter aangeven. (In dit voorbeeld is het gegevenstype van de parameter EventType .)

Aan elke type gebeurtenis waarnaar u kunt luisteren is een ActionScript-klasse gekoppeld. Het gegevenstype dat u voor de functieparameter opgeeft is altijd de gekoppelde klasse van de specifieke gebeurtenis waarop u wilt reageren. Een gebeurtenis click (die wordt getriggerd wanneer de gebruiker met de muis op een item klikt) is bijvoorbeeld gekoppeld aan de klasse MouseEvent. Als u een listenerfunctie wilt schrijven voor een gebeurtenis click , definieert u de listenerfunctie met een parameter met het gegevenstype MouseEvent. Ten slotte schrijft u tussen de accolades openen en sluiten ( { ... } ) de instructies die uitgevoerd moeten worden wanneer de gebeurtenis plaatsvindt.

De functie voor het behandelen van de gebeurtenis is nu geschreven. Vervolgens vertelt u het gebeurtenisbronobject (het object waarin de gebeurtenis plaatsvindt, zoals de knop) waarmee u de functie wilt oproepen wanneer de gebeurtenis plaatsvindt. U kunt uw functie bij het gebeurtenisbronobject registreren door de methode addEventListener() van dit object op te roepen (alle objecten met gebeurtenissen die ook een methode ( addEventListener() bevatten). Voor de methode addEventListener() zijn twee parameters nodig:

  • Als eerste de naam van de specifieke gebeurtenis waarop moet worden gereageerd. Elke gebeurtenis is gekoppeld aan een bepaalde klasse. Elke gebeurtenisklasse heeft een bepaalde waarde, die een unieke naam heeft, opgegeven voor elke gebeurtenis in deze klasse. Gebruik deze waarde voor de eerste parameter.

  • Als tweede de naam van de functie die reageert op de gebeurtenis. Een functienaam wordt zonder haakjes geschreven wanneer deze als parameter wordt doorgegeven.

Gebeurtenissen verwerken

Hieronder volgt een stapsgewijze beschrijving van het proces dat plaatsvindt wanneer u een gebeurtenislistener maakt. In dit voorbeeld wordt een listenerfunctie gemaakt die wordt aangeroepen wanneer op een object myButton wordt geklikt.

De code die is geschreven door de programmeur ziet er als volgt uit:

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

Hieronder wordt beschreven hoe deze code werkt wanneer deze wordt uitgevoerd:

  1. Wanneer het SWF-bestand wordt geladen, houdt de computer bij dat deze de functie eventResponse() bevat.

  2. Vervolgens wordt de code (met name de coderegels die zich niet in een functie bevinden) uitgevoerd door de computer. In dit geval is dat slechts één regel code: de methode addEventListener() van het gebeurtenisbronobject ( myButton ) aanroepen en de functie eventResponse doorgeven als parameter.

    Intern houdt myButton een lijst bij van alle functies die naar elke van deze gebeurtenissen horen. Wanneer de methode addEventListener() wordt opgeroepen, slaat myButton de functie eventResponse() op in de lijst met gebeurtenislisteners.

  3. Op een gegeven moment klikt de gebruiker op het object myButton , waardoor de gebeurtenis click wordt geactiveerd (in de code geïdentificeerd als MouseEvent.CLICK ).

    Op dat moment gebeurt het volgende:

    1. Er wordt een object gemaakt als instantie van de klasse die gerelateerd is aan de gebeurtenis (in dit voorbeeld MouseEvent). Dit object is vaak een instantie van de klasse Gebeurtenis. Voor muisgebeurtenissen is dit een instantie MouseEvent. Voor andere gebeurtenissen is dit een instantie van de klasse die aan die gebeurtenis gerelateerd is. Het gemaakte object wordt het gebeurtenisobject genoemd en bevat bepaalde gegevens over de gebeurtenis die heeft plaatsgevonden: het type gebeurtenis, waar deze heeft plaatsgevonden en andere informatie over de gebeurtenis indien van toepassing.

    2. Vervolgens controleert de computer de lijst met gebeurtenislisteners die zijn opgeslagen door myButton . Deze functies worden één voor één doorlopen, waarbij elke functie wordt opgeroepen en het gebeurtenisobject aan de functie wordt doorgegeven als parameter. Aangezien de functie eventResponse() een van de listeners is van myButton , roept de computer de functie eventResponse() op als onderdeel van dit proces.

    3. Wanneer de functie eventResponse() wordt aangeroepen, wordt de code in deze functie uitgevoerd en worden daarmee de opgegeven handelingen uitgevoerd.

Voorbeelden van gebeurtenisafhandeling

Hier zijn nog een paar concretere voorbeelden van de gebeurtenisafhandelingscode. Deze voorbeelden zijn bedoeld om u een aantal algemene gebeurteniselementen en mogelijk beschikbare variaties voor het schrijven van gebeurtenisafhandelingscode te laten zien:

  • Op een knop klikken om de huidige filmclip af te spelen. In het volgende voorbeeld is playButton de instantienaam van de knop en is this een speciale naam die staat voor ‘het huidige object’:

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • Detecteren dat er in een tekstveld wordt getypt. In dit voorbeeld is entryText een invoertekstveld en is outputText een dynamisch tekstveld:

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • Op een knop klikken om naar een URL te navigeren. In dit geval is linkButton de instantienaam van de knop:

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

Objectinstanties maken

Voordat u een object kunt gebruiken in ActionScript, moet dit object uiteraard wel eerst bestaan. Een onderdeel van het maken van een object is het declareren van een variabele. Hiermee wordt echter alleen een lege plaats in het computergeheugen gemaakt. Voordat u een variabele kunt gebruiken of manipuleren, moet u er een werkelijke waarde aan toekennen (dat wil zeggen, een object maken en dit in de variabele opslaan). Het proces om een object te maken wordt ook wel het instantiëren van het object genoemd. U maakt met andere woorden een instantie van een bepaalde klasse.

Een eenvoudige manier om een objectinstantie te maken is zonder ActionScript. Plaats in Flash Professional een filmclipsymbool, knopsymbool of tekstveld op het werkgebied en wijs er een instantienaam aan toe. Flash professional declareert automatisch een variabele met die instantienaam, maakt een objectinstantie en slaat dat object in een variabele op. In Flex kunt u een component in MXML maken, door een MXML-tag te coderen of het component op de editor in de modus Flash Builder Design te plaatsen. Wanneer u aan dat component een id toewijst, wordt die id de naam van een ActionScript-variabele met een componentinstantie.

U wilt echter een object misschien niet altijd visueel maken en dit is niet mogelijk voor niet-visuele objecten. Er zijn verschillende andere manieren waarop u alleen met ActionScript objectinstanties kunt maken.

Allereerst kunt u voor verschillende gegevenstypen in ActionScript een instantie maken met behulp van een letterlijke expressie . Dit is een waarde die rechtstreeks in de ActionScript-code wordt geschreven. Hieronder volgen enkele voorbeelden:

  • Letterlijke numerieke waarde (voer het getal rechtstreeks in):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • Letterlijke tekenreekswaarde (plaats dubbele aanhalingtekens rond de tekst):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • Letterlijke Booleaanse waarde (gebruik de letterlijke waarden true of false ):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • Letterlijke arraywaarde (laat een door komma's gescheiden lijst met waarden teruglopen in vierkante haken):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • Letterlijke XML-waarde (voer de XML rechtstreeks in):

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

In ActionScript zijn ook letterlijke expressies gedefinieerd voor de gegevenstypen Array, RegExp, Object en Function.

De meest algemene manier om voor elk gegevenstype een instantie te maken is met behulp van de operator new met de klassenaam, zoals hier wordt weergegeven:

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

Het maken van een object met behulp van de operator new wordt doorgaans het ‘aanroepen van de klassenconstructor’ genoemd. Een constructor is een speciale methode die wordt aangeroepen tijdens het proces waarin een instantie van een klasse wordt gemaakt. Wanneer u op deze manier een instantie maakt, moet u erop letten dat u na de klassenaam een haakje plaatst. Soms geeft u tussen deze haakjes parameterwaarden op. Dit zijn twee dingen die u ook doet wanneer u een methode oproept.

Zelfs bij gegevenstypen waarvoor u instanties kunt maken met behulp van een literale expressie, kunt u de operator new gebruiken om een objectinstantie te maken. De volgende twee coderegels doen bijvoorbeeld precies hetzelfde:

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

Het is van belang dat u bekend met de manier new ClassName () om objecten te maken. Veel ActionScript-gegevenstypen worden niet visueel weergegeven. U kunt ze niet maken door een item in het werkgebied van Flash Professional, de ontwerpmodus of de MXML-editor van Flash Builder te plaatsen. U kunt in ActionScript van een van deze gegevenstypen alleen een instantie maken met de operator new .

Adobe Flash Professional

In Flash Professional kan de operator new ook worden gebruikt om een instantie te maken van een filmclipsymbool dat in de bibliotheek is gedefinieerd maar niet in het werkgebied is geplaatst.