Exempel på Drawing API: algoritmisk visuell generator

Flash Player 9 och senare, Adobe AIR 1.0 och senare

I exemplet Algoritmisk visuell generator ritas flera ”satelliter”, eller cirklar, dynamiskt på scenen. Satelliterna rör sig i en cirkulär omloppsbana. Bland annat utforskas följande funktioner:

  • använda Drawing API för att rita en grundläggande form med dynamiskt utseende

  • koppla användarinteraktivitet till egenskaperna som används i en ritåtgärd

  • skapa animering genom att rensa scenen och rita om i varje bildruta.

I exemplet i det föregående delavsnittet animeras en ensam ”satellit” med händelsen Event.ENTER_FRAME. Det här exemplet utökar exemplet i det föregående delavsnittet genom att en kontrollpanel med en serie skjutreglage som omedelbart uppdaterade visningen av flera satelliter lades till. I det här exemplet formaliseras koden till externa klasser och koden där satelliter skapas placeras i en slinga. En referens till varje satellit sparas i arrayen satellites.

Programfilerna för det här exemplet finns på www.adobe.com/go/learn_programmingAS3samples_flash_se. Programfilerna finns i mappen Samples/AlgorithmicVisualGenerator. I den mappen finns följande filer:

File

Beskrivning

AlgorithmicVisualGenerator.fla

Huvudprogramfilen i Flash Professional (FLA).

com/example/programmingas3/algorithmic/AlgorithmicVisualGenerator.as

Den klass som ger programmet dess huvudsakliga funktionalitet, inklusive att rita satelliter på scenen och att svara på händelser från kontrollpanelen för att uppdatera variablerna som påverkar hur satelliterna ritas.

com/example/programmingas3/algorithmic/ControlPanel.as

En klass som hanterar användarinteraktivitet med flera skjutreglage och skickar händelser när interaktivitet sker.

com/example/programmingas3/algorithmic/Satellite.as

En klass som representerar visningsobjektet som kretsar i en omloppsbana runt en mittpunkt och som innehåller egenskaper som relaterar till det aktuella ritningsläget.

Ställa in avlyssnarna

Programmet skapar först tre avlyssnare. Den första lyssnar efter en händelse som skickas från kontrollpanelen om att satelliterna behöver ritas om. Den andra lyssnar efter ändringar av SWF-filens scenstorlek. Den tredje lyssnar efter varje bildruta som går i SWF-filen och används för att rita om med funktionen doEveryFrame().

Skapa satelliterna

När dessa avlyssnare har ställts in anropas funktionen build(). Funktionen anropar först funktionen clear(), som tömmer arrayen satellites och rensar allt som tidigare ritats på scenen. Detta är nödvändigt eftersom funktionen build() kan anropas igen varje gång kontrollpanelen skickar en händelse om att det ska göras, till exempel när färginställningarna har ändrats. I så fall måste satelliterna tas bort och skapas om.

Funktionen skapar sedan satelliterna och ställer in de startegenskaper som behövs för att skapa dem. Det är bland annat variabeln position som startar på en slumpmässig position i omloppsbanan, och variabeln color, som i det här exemplet inte ändras efter att satelliten har skapats.

När varje satellit skapas läggs en referens till den till i arrayen satellites. När funktionen doEveryFrame() anropas uppdateras den till alla satelliter i arrayen.

Uppdatera satellitpositionen

Funktionen doEveryFrame() är hjärtat av programmets animeringsprocess. Den anropas för varje bildruta med samma frekvens som bildrutehastigheten i SWF-filen. Eftersom variablerna för ritåtgärden ändras en aning för varje bildruta ger det intrycket av animering.

Den första funktionen rensar allt som tidigare ritats och ritar om bakgrunden. Sedan skapas en slinga genom varje satellitbehållare och egenskapen position ökas för varje satellit. Egenskaperna radius och orbitRadius uppdateras om de har ändrats genom användarinteraktivitet från kontrollpanelen. Slutligen uppdateras satelliten till sin nya position genom ett anrop till metoden draw() i klassen Satellite.

Observera att räknaren, i, bara ökar värdet upp till variabeln visibleSatellites. Detta beror på, att om användaren har begränsat antalet satelliter som visas med kontrollpanelen, ska de resterande satelliterna i slingan inte ritas om utan döljas. Detta händer i en slinga som omedelbart följer slingan som ritningen görs i.

När funktionen doEveryFrame() är klar uppdateras antalet visibleSatellites i position på skärmen.

Svara på användarinteraktivitet

Användarinteraktivitet görs via kontrollpanelen och hanteras av klassen ControlPanel. Klassen ställer in en avlyssnare tillsammans med det lägsta värdet, högsta värdet och standardvärdet för varje reglage. När användaren flyttar reglagen anropas funktionen changeSetting(). Funktionen uppdaterar kontrollpanelens egenskaper. Om ändringen kräver att visningen ritas om skickas en händelse som sedan hanteras i huvudprogramfilen. När kontrollpanelens inställningar ändras ritar funktionen doEveryFrame() om varje satellit med de uppdaterade variablerna.

Ytterligare anpassning

Det här exemplet är bara en grundläggande schematisk representation av hur man skapar visuellt innehåll med Drawing API. Relativt få kodrader används för att skapa en interaktiv upplevelse som ser ganska komplicerad ut. Trots det kan exemplet utökas med mindre ändringar. Några idéer:

  • Funktionen doEveryFrame() skulle kunna inkrementera satellitens färgvärde.

  • Funktionen doEveryFrame() skulle kunna krympa eller expandera satellitens radie över tiden.

  • Satellitens radie behöver inte vara en cirkel. Klassen Math skulle kunna användas för att flytta den i till exempel en sinusvågrörelse.

  • Satelliterna skulle kunna ha träffdetektering med andra satelliter.

Drawing API kan användas som ett alternativ till att skapa visuella effekter i Flash-utvecklingsmiljön för att rita grundläggande former vid körning. Det kan emellertid också användas för att skapa visuella effekter med variation och omfång som inte går att göra för hand. Med Drawing API och lite matematik kan en ActionScript-utvecklare ge liv åt många oväntade skapelser.