• No results found

En studie av plattformsoberoende med Haxe och NME

N/A
N/A
Protected

Academic year: 2021

Share "En studie av plattformsoberoende med Haxe och NME"

Copied!
32
0
0

Loading.... (view fulltext now)

Full text

(1)

Institutionen för datavetenskap

Department of Computer and Information Science

Examensarbete

En studie av plattformsoberoende med Haxe

och NME

av

Henrik Eriksson Reimer

LIU-IDA/LITH-EX-G--12/023--SE

(2)

Linköpings universitet Institutionen för datavetenskap

Examensarbete

En studie av plattformsoberoende med Haxe

och NME

av

Henrik Eriksson Reimer

LIU-IDA/LITH-EX-G--12/023--SE

2012-08-28

Handledare: Johan Åberg, Linköpings universitet, Linköping Examinator: Johan Åberg, Linköpings universitet, Linköping

(3)

Innehållsförteckning

Sammanfattning...2 1 Inledning...2 1.1 Övergripande motivering...2 1.2 Frågeställning...2 1.3 Avgränsningar...3 1.4 Källkritik...3 2 Teori...4 2.1 Operativsystem...4 2.2 Multiplattformsutveckling...6

2.3 Haxe och NME...6

3 Metod...7

3.1 Angreppssätt...7

3.2 Spelbeskrivning...7

3.3 Kravspecifikation...7

3.4 Redogörelse av arbetet...8

3.5 Problem under arbetets gång...11

3.6 Metodkritik...14 4 Resultat...14 4.1 Genomgång av spelet...14 4.1.1 Annoterade skärmbilder...14 4.1.2 Screencast...15 4.2 Funktionalitetsresultat...15 4.3 Skärmbilder...16 4.4 Bilduppdateringsfrekvenser...20 5 Diskussion...22 6 Slutsats...25 Referenser...27

(4)

Sammanfattning

1 Inledning

1.1 Övergripande motivering

Definitionen av en dator är en programmerbar maskin som automatiskt utför en sekvens aritmetiska eller logiska operationer. Sekvensen går att ändra och medför att datorn kan lösa fler än ett sorts problem. 1

Definitionen är enhetlig, men hur själva datorn är konstruerad, vilka funktioner den har och hur programkod läses och skrivs är vida skiljaktiga. Det betyder att programkod skriven för en specifik datorplattform i de flesta fall inte går att exekvera på en annan plattform utan att modifieras eller skrivas om, om det överhuvudtaget är möjligt. Det gäller även om de två datorsystemen används i samma syfte. Exempelvis så kan en smartphone2 med operativsystemet IOS3

inte köra applikationer skrivna för operativsystemet Android4 och vice versa,

trots att båda är smartphones och båda använder ARM-processorer5.

Detta innebär problem för mjukvaruutvecklare. Att behöva skriva om sitt program för varje enskild plattform är tidskrävande och kostsamt. Det ideala vore att kunna skriva sitt program en gång och sedan kunna köra det på alla tillgängliga plattformar. Det är det som är målet med plattformsoberoende.

1.2 Frågeställning

Det jag ska undersöka är hur väl program skrivna i Haxe6 med det externa

biblioteket NME7 uppnår plattformsoberoende. Mer specifikt hur väl ett spel

skrivet i Haxe med NME är plattformsoberoende givet att programkoden är den samma och inte modifierad för varje plattform. På hemsidan för NME ställs frågan ”Does This Actually Work?” och svaret som ges är ”As surprising as it sounds, NME really works. You do not need to spend your time messing with cross-platform compatibility, but you also do not have to sacrifice runtime performance or access to platform features.”.8

För att Haxe och NME ska anses vara plattformsoberoende ska samma källkod resultera i att spel som fungerar på ett tillfredsställande sätt på alla de testade plattformarna, givet att jag i programkoden tar hänsyn till den hårdvara som finns tillgänglig på plattformarna. En persondator har i regel tillgång till tangentbord och mus medan en smartphone i regel inte gör det. En smartphone har däremot tillgång till en touchscreen vilket majoriteten av persondatorer inte har. Med det i åtanke går det t.ex. inte att förvänta sig att ett program som är skrivet att enbart använda mus som inmatningsenhet att fungera på en

plattform utan mus. Kriterierna för att spelet fungerar på ett tillfredsställande sätt är dessa:

De funktioner som är listade i kravspecifikation i del 3.3 ska fungerar korrekt.

(5)

• Grafiken ska se likadan ut jämfört med på andra plattformar.a

• Den genomsnittliga bilduppdateringsfrekvensen ska ha ett värde på minst 40 FPS9.

De plattformar jag kommer att testa spelet på är följande: • Windows10

• Ubuntu11

• Mac OS X12

• Android • IOS

För Windows, Ubuntu och Mac OS X kommer jag att testa spelet både i det plattformsoberoende Flash-formatet13 och som plattformsberoende C++ filer14.

Jag kommer att inkludera skärmbilder av spelet när det körs på de olika plattformarna som verifikation att spelet faktiskt fungerar samt att spelet ser likadant ut oavsett plattform. För att jämföra skillnaderna i

bilduppdateringsfrekvens och för att se att minst 40 FPS uppnås så kommer bilduppdateringsfrekvensen att mätas för varje plattform.

Annoterade skärmbilder som illustrerar hur det färdiga spelet fungerar kommer att ingå samt länkar till en screencast15 av spelet.

1.3 Avgränsningar

För ett perfekt plattformsoberoende ska en applikation gå att köra på alla plattformar och operativsystem som finns, vilket är omöjligt i praktiken bland annat på grund av alla skillnader i den stora mängd hårdvara som existerar. Jag har därför begränsat antalet plattformar till de mest vanliga.

Jag kommer bara att använda 2-diminsionell grafik i spelet. Att utveckla ett spel med 3D-grafik skulle förmodligen ta för lång tid och i skrivande stund är stödet för 3D i NME väldigt begränsat.

Jag kommer att fokusera på funktionaliteten av spelet och inte på optimering. Jag nöjer mig med att spelets alla delar fungerar korrekt. Jag kommer inte att spendera tid på att optimera koden att vara så resurseffektiv som möjligt.

1.4 Källkritik

Jag använder Nationalencyklopedin i så stor utsträckning som möjligt då det är en tillförlitlig källa med artiklar på svenska. Om ingen artikel finns tillgänglig på Nationalencyklopedins hemsida och det handlar om en produkt så använder jag tillverkarens webbsida för produkten som källa. Om det istället handlar om datortermer och begrepp har jag valt att använda artiklar från webbsidan WhatIs.com.16 Sidan innehåller över 7500 IT-relaterade definitioner och

används enligt skaparna själva av yrkesmän inom IT och affärer. Webbsidans innehåll och artiklar skrivs av två redaktörer som arbetat i cirka ett decennium. En artikels författare anges med namn och innehåller datumet det senast uppdaterades samt eventuella bidragsgivare. På grund av detta anser jag att

(6)

artiklarna är tillförlitliga.

2 Teori

2.1 Operativsystem

Ett operativsystem är en samling mjukvaror som hanterar en dators hårdvara, koordinerar hårdvarans aktiviteter och fördelar tillgängliga resurser åt

användaren.17 Ett operativsystem består av tre delar, operativsystemkärnan,

systembiblioteket och användarprogram. Kärnan är den del av

operativsystemet som kommunicerar med hårdvaran, t.ex. arbetsminne och in- och utmatningsenheter. En annan beskrivning av kärnan är att det är det

program som alltid körs när datorn är påslagen.18 Systembiblioteket består av

grundläggande infrastruktur som används av övriga applikationer för att kommunicera med kärnan om lån av systemresurser. Kärnan ser till att

applikationerna får tillgång till hårdvaran utan att det uppstår några konflikter. Användarprogram är applikationer för att använda systemet, tex.

konfigurationsverktyg, texteditorer och filhanterare. Användargränssnittet som användaren använder sig utav för att interagera med datorns applikationer brukar oftast anses vara en del av operativsystem, men inte alltid. Övriga applikationer så som webbläsare, ordbehandlare och bildbehandlingsprogram hör inte till operativsystemet.

Figur 1. Schematisk bild över operativsystemets relation till resten av datorsystemet

Applikationer ber om systemresurser från kärnan genom så kallade

systemanrop.19 Programutvecklare brukar vanligtvis inte använda systemanrop

(7)

Interface, förkortat API. Två av de mest vanliga API:erna är Win32 API för Windows-system och POSIX API för POSIX-system, vilket inkluderar så gott som alla UNIX-, Linux- och Mac OS X-system. Ett API innehåller ett antal funktioner, inklusive eventuella parametrar och returvärden, som en

programutvecklare har att arbeta med för att utnyttja en dators systemresurser. API:erna själva använder dock systemanrop.20 Man kan fråga sig varför de

flesta programutvecklare väljer att använda sig utav ett API istället för att använda systemanrop och det finns flera orsaker. En orsak är att det blir lättare att utveckla samma program till flera plattformar. Olika system har olika systemanrop, men om systemen har stöd för samma API så kan i teorin samma API-funktioner användas på samtliga system.21 En annan anledning är att

systemanrop ofta är mer detaljerade och svåranvända än vad API-funktioner är. Ett sådant här API för systemresurser kallas drivrutins-API och används som ett lager mellan högnivåprogrammerings och lågnivåresurser. Men det finns även API:er som låter en mjukvara använda funktionalitet från en annan mjukvara, så kallade högnivå-API:er. Ett exempel på ett högnivå-API är Open DataBase Connectivity, förkortat ODBC.22 Genom att använda ODBC-API:et

kan en programmerare låta sin mjukvara hantera databaser utan att behöva bry sig om databashanterare eller SQL-kod23 som istället sköts av ODBC. API:er

kan liksom applikationer vara plattformsberoende eller plattformsoberoende. API:erna OpenGL24 och Direct3D25 används båda till 3D-datorgrafik. OpenGL

finns tillgängligt för de flesta persondator-operativsystem, spelkonsoler, handdatorer och mobiltelefoner medan Direct3D endast går att använda till Windows och Xbox-konsoler26.

Det släpps hela tiden ny hårdvara så ett operativsystem kan inte av sig själv veta hur kommunikationen ska gå till med framtida hårdvaror. Därför använder sig operativsystem utav drivrutiner27. Drivrutiner möjliggör att

operativsystemet på rätt sätt kan utnyttja hårdvaruresurser.28 Eftersom

operativsystem skiljer sig åt sinsemellan behövs det olika drivrutiner för olika operativsystem. Det är i det flesta fall hårdvarutillverkaren som tillverkar drivrutinerna för sina produkter. De avgör vilka operativsystem de tillverkar drivrutiner för. Det kan exempelvis anses att inte vara lönsamt att tillverka drivrutiner för ett operativsystem med en liten utbredning bland

konsumenterna. Därför kan det på en dator med stöd för flera operativsystem finnas hårdvara som endast fungerar med vissa, trots att datorn är den samma. Det är med andra ord inte enbart mjukvaror som kan vara plattformsberoende. För att utveckla en applikation till fler än en plattform måste man därför ta hänsyn till att operativsystem och API:er kan skilja sig åt och att det kanske inte finns stöd i form av drivrutiner för de hårdvaruresurser man använder sig utav. Om man till exempel har utvecklat ett spel till Android i Java och vill göra spelet tillgängligt till IOS måste applikationen skrivas om med Objectiv-C29 då det inte finns någon Java-kompilator för IOS. Ett annat exempel är om

man använt sig utav Direct3D för att göra ett spel till Windows och och vill göra spelet tillgängligt till Mac OS X och/eller Linux. Då måste man skriva om koden och ersätta alla anrop till Direct3D API:et med något annat eftersom Direct3D endast är tillgängligt till Windows. Om samma spelet använder sig utav en spelkontroll måste det finnas drivrutiner för spelkontrollen tillgängligt för Mac OS X och/eller Linux för att använda den. Finns det ingen drivrutin går det kanske att tillverka en själv om tillverkaren har gjort

(8)

hårdvaruspecifikationerna tillgängliga för allmänheten, förutsatt att man kan drivrutinsutveckling. Är specifikationerna hemliga går det kanske att gissa sig till dem med reverse engineering, vilket är svårt och tidsödande. Oavsett om specifikationerna är tillgängliga eller ej så kommer tillverkaren inte att ge sina kunder någon support på produkten om en drivrutin de ej har tillverkat själva används.

Alla dessa hinder som kan uppstå kan göra att programutveckling till fler än en plattform blir en lång och kostsam process.

2.2 Multiplattformsutveckling

Ett tillvägagångssätt att göra sin applikation tillgänglig för flera plattformar är att använda olika källkoder för varje plattform. Men som nämns tidigare kan det vara tidsödande och kostsamt.

Ett annat tillvägagångssätt är abstraktion av plattformen. För att lösa problemet med olika operativsystem och hårdvaror så körs programmen i en så kallad virtuell maskin.30 Applikationen läses av den virtuella maskinen som i sin tur

översätter det till plattformsspecifika instruktioner. Så länge det finns en virtuell maskin för plattformen så ska applikationen i teorin klaras av att köras på den. I praktiken är det inte alltid riktigt så, t.ex. i fallet med Java31

behandlas inte alla operativsystems processer på samma sätt vilket medför att trådade program32 kan prestera olika mellan plattformar eller inte fungera alls.33

Ett tredje tillämpningssätt är att använda endast en källkod som sedan kompileras till plattformsspecifika binära filer34 av kompilatorn.

2.3 Haxe och NME

Programspråket Haxe som jag kommer att använda använder det tredje tillvägagångssättet som nämns ovan. Förutom att kompilera till

plattformsspecifika binära filer kan Haxe-kod även kompileras till kod för vissa virtuella maskiner och använder på så sätt även tillvägagångssättet med virtuella maskiner i vissa fall. Haxe har ett standardbibliotek med färdiga komponenter som fungerar på alla plattformar som Haxe stödjer. Men det finns även plattformsspecifika bibliotek att tillgå. Om de används går programmet bara att exekvera på den specifika plattformen.

I skrivande stund kan Haxe-kod kompileras till Javascript-filer35, Flash-filer,

NekoVM-bytecode36, PHP-filer37 och C++ kod. Stöd för C#38 och Java är under

utveckling.

NME är ett gratis öppet källkod ramverk till Haxe som gör det möjligt att med ett Flash-liknande API kompilera mjukvara till IOS, Android, webOS39,

BlackBerry40, Windows, Mac41, Linux42, Flash och HTML543 med samma

(9)

3 Metod

3.1 Angreppssätt

Mitt angreppssätt kommer att vara att skriva ett enklare spel i Haxe och NME och därefter testa spelet på olika plattformar för att besvara frågeställningen i del 1.2.

3.2 Spelbeskrivning

Spelet jag ska utveckla kommer att vara av ett enklare slag då tiden är begränsad.

Spelidén är att göra ett spel liknande Missile Command där man skjuter ner inkommande projektiler.44 För att göra spelupplevelsen lite annorlunda finns

fiender i 8 olika färger. Svart, vit, röd, grön, blå, gul, cyan och magenta. Spelaren har tillgång till tre ytor i färgerna röd, grön och blå som går att slå av och på. Genom att slå av och på dessa ytor går det att med principen om additiv färgbladning45 bilda de 8 färger som fienderna kan anta, se tabell 1. De

projektiler spelaren kan skjuta iväg har den färg som kombinationen av de tre ytorna bildar. För att förgöra en fiende måste den och projektilen ha samma färg. Om en fiende når spelarens rymdskepp utan att bli nedskjuten minskas en livsmätare med 1. När denna når 0 är spelet över. Varje besegrad fiende ger 10 poäng, den högsta uppnådda poängen sparas och visas som ett highscore.

Tabell 1. Möjliga kombinationer

Röd Grön Blå Resulterande färg På På På Vit På På Av Gul På Av På Magenta På Av Av Röd Av På På Cyan Av På Av Grön Av Av På Blå Av Av Av Svart

3.3 Kravspecifikation

• Spelet ska innehålla färdiggenererade bitmaps46, så kallade sprites47.

• Spelet ska innehålla ljudeffekter men användaren ska kunna stänga av dessa om så önskas.

• Spelet ska spara den högsta poängen som har nåtts och den informationen ska inte gå förlorad när spelet stängs av.

• Spelet ska kontrolleras med touchscreen på smartphones och med tangentbord och mus på persondatorer.

(10)

3.4 Redogörelse av arbetet

Haxe är ett språk baserat på ActionScript, ett objektorienterat språk som ursprungligen utvecklades av Macromedia Inc, men som numera ägs av Adobe Systems.48 Då jag inte hade någon tidigare erfarenhet av Haxe eller

ActionScript började jag arbetet med att undersöka vilka skillnader och likheter Haxe har i jämförelse med de programmeringsspråk jag har erfarenhet av. Eftersom Haxe är ett objektorienterat språk var begrepp och metoder som klasser och arv lätta att applicera från tidigare erfarenheter med

objektorienterade språk som Java. Där efter började jag programmera och när jag stötte på något Haxe-specifikt problem letade jag efter kodexempel eller foruminlägg om problemet.

Jag började med det mest grundläggande som att ladda en bitmap-bild i minnet och visa den.

Där efter implementerade jag stegvis de mer avancerade delarna.

Förutom NME-bibilioteket använde jag även biblioteket Actuate av Joshua Granick, som även är en av utvecklarna av NME.49 Actuate används till vad

som på engelska kallas inbetweening eller tweening.50 Det tweening gör är att

givet två bilder generera mellanliggande bilder så att den första bilden stegvis omvandlas till den andra. Ett användningsområde som jag använde i mitt spel är att givet en startplacering och en slutplacering få ett bildobjekt att röra sig över spelplanen.

Ytterligare ett användningsområde jag använde var att få bildobjekt att krympa och tonas bort.

Kodexempel: Ladda och visa bitmaps var spriteBitmapData:BitmapData =

Assets.getBitmapData("assets/mySprite.jpg");

var spriteGraphic:Bitmap = new Bitmap (spriteBitmapData); addChild(spriteGraphic);

I detta exempel heter bitmap-filen mySprite.jpg och finns i en mapp kallad assets.

Kodexempel: Animera en förflyttning av ett bildobjekt

Actuate.tween (mySprite, time, { x: mySprite.x + 25, y: mySprite.y + 50 });

Variabeln mySprite är bildobjektet och variabeln time anger i sekunder hur lång tid förflyttningen tar. I detta fall kommer mySprite att förflyttas 25 pixlar åt höger och 50 pixlar nedåt från sin ursprungsposition.

(11)

Föutom tweening innehåller Actuate även en timerfunktioner som jag använde för att skapa tidsintervaller för fiendevågor.

För kollisionsdetektion använde jag så kallade hitboxes och signalerade kollsion vid överlapp.51

Jag använde klassen TextField52 och typsnittet Abduction 200053 för att visa

text, bland annat till poängmätaren.

Som bakgrund använder jag en public domain-bild av galaxen M81 taget av Hubble-teleskopet.54

Spelets ljudeffekter kommer från webbsidan www.flashkit.com och är freeware.

När spelaren avfyrar en projektil använder jag ett ljudklipp kallat ”Missile Launch”.55 När projektilen exploderar använder jag ett ljudklipp kallat

”Explosion”.56 Slutligen använder jag ljudklippet ”Barrel explode” när spelaren

tar skada.57

Kodexempel: Tona bort och krymp ett bildobjekt

Actuate.tween (mySprite, 1, { alpha: 0, height: 0, width: 0, x: x, y: y }, false);

Alpha, height, width, x och y anger vad värdena hos mySprite blir efter 1 sekund. X och y värdena består men alpha-värdet och höjden och bredden minskar gradvis till 0.

Kodexempel: Kör en metod med fördröjning Actuate.timer (1).onComplete (nextWave);

Efter en sekund körs metoden nextWave().

Kodexempel: Ladda typsnitt och visa text

var font = Assets.getFont ("assets/Abduction2000.ttf"); var format = new TextFormat (font.fontName, 24, 0xFFFFFF);

Laddar typsnittet Abduction2000 och ställer in att texten ska ha storlek 24 och vara svart.

var Int:score = 100;

var scoreLabel:TextField = new TextField(); scoreLabel.defaultTextFormat = format; scoreLabel.selectable = false; scoreLabel.embedFonts = true; scoreLabel.width = 520; scoreLabel.height = 25; scoreLabel.x = 120; scoreLabel.y = 340;

scoreLabel.text = "Your score was " + score; addChild(scoreLabel);

Resulterar i en text på position x = 120 y = 340, med bredden 520 pixlar och höjden 25 pixlar. Texten kommer vara ”Your score was 100”.

(12)

För att spara highscore-värdet använde jag local shared objects som kan liknas vid HTTP cookies.58

För att jämföra prestandaskillnaden mellan olika plattformar implementerade jag en mätare, som nämndes tidigare, för hur många gånger skärmen ritas om per sekund, dvs. bilduppdateringsfrekvensen. Mätvärdet som används brukar kallas frames per second, eller förkortat FPS.

Ett högt FPS-värde ger mer flytande och mjuka animationer medan ett lågt FPS-värde ger hackiga animationer. Många parallella bildobjekt och

Kodutdrag: FPS-mätare

private var fpsCounter:TextField; private var fps:Int;

private var drawnFrames:Int; private var elapsedTime:Int; private var averageFps:Float; private var minFps:Int; private var maxFps:Int;

private var minMaxFpsCounter:TextField; private var averageFpsCounter:TextField; Actuate.timer (1).onComplete (updateFps);

Actuate.timer (1).onComplete (updateAverageFps); private function updateFps() {

if (fps > maxFps) { maxFps = fps;

minMaxFpsCounter.text = "Min FPS " + minFps + " Max FPS " + maxFps;

}

if (fps < minFps) { minFps = fps;

minMaxFpsCounter.text = "Min FPS " + minFps + " Max FPS " + maxFps;

}

fpsCounter.text = "FPS " + fps; drawnFrames = drawnFrames + fps; fps = 0;

Actuate.timer (1).onComplete (updateFps); }

private function updateAverageFps() { elapsedTime = elapsedTime + 1;

averageFps = drawnFrames / elapsedTime;

averageFpsCounter.text = "Average FPS " + averageFps; Actuate.timer (1).onComplete (updateAverageFps); }

private function this_onEnterFrame (event:Event):Void { fps = fps + 1;

// Övrig kod }

Metoden this_onEnterFrame körs varje gång skärmen ritas om. Metoderna updateFPS och updateAverageFPS körs engång i sekunden. När updateFPS körs har variabeln fps ökat med antalet gånger som skärmen ritats om. Det jämförs med de högsta och lägsta tidigare uppmätta värdena. Värdet visas på skärmen och sedan nollställs variabeln fps. Metoden updateAverageFPS tar det totala antalet omritningar av skärmen och delar det med antal sekunder som har förflutit.

(13)

beräkningar kan göra att antalet FPS sjunker om hårdvaran inte är tillräckligt snabb. Ineffektiv programkod kan också resultera i ett lägre FPS-värde trots snabb hårdvara. I konfigurationsfilen för en NME-källkod kan man ange antalet FPS man vill att applikationen ska använda. Jag valde att sätta detta värde till 60, när spelet är färdigutvecklat kan man med FPS-mätaren se hur väl detta värde uppnås.

För att hantera olika skärmupplösningar har jag valt att skala upp eller ner spelfältet när andra upplösningar än 640x480 används. Bildförhållandet59

bevaras inte, vilket medför att på exempelvis en 800x480 skärm så kommer bilden att skalas upp horisontellt men inte vertikalt. I detta fall gör det att bildobjekten kommer sträckas ut på bredden men inte på höjden. Jag har ändå valt att inte bevara bildförhållandet. Givet samma exempel som ovan så skulle ett bevarat bildförhållande inte sträcka ut bilden, men endast 640x480 av skärmen skulle användas. Med andra ord skulle en area på 160x480 pixlar av skärmen vara tom och inte användas.

3.5 Problem under arbetets gång

För att slippa skapa 8 bitmap-bilder, en för varje färg, för fiender och spelarens projektiler använde jag mig utav en färgtransformeringsfunktion ur Actuate-bibilioteket.

På så sätt kunde jag använda endast en bitmap-bild och sedan färga den till valfri färg. Så istället för 16 bitmaps-bilder klarade jag mig med 2. Med färre bitmap-bilder tar applikationen mindre plats i internminnet och på

lagringsmediet. Det fungerade som tänkt när det kördes i flash, men jag upptäckte att när det kördes i C++ för windows och när det kördes på android så blev alla färgtranformeringar svarta. Jag hittade en lösning genom att använda en annan färgstransformeringsfunktion från NME-biblioteket.

Kodexempel: Färgtransformation med Actuate

Actuate.transform (MySprite, 1).color (0xFF0000, 0.5);

I exemplet ovan är MySprite ett bildobjekt, 1 efteråt betyder att alpha-värdet som bestämmer opaciteten för bildobjektet är 100%. 0x betyder att det följer ett hexadecimalt tal och FF0000 ger ett RGB-värde på 255 rött, 0 grönt och 0 blått, vilket ger röd färg. 0.5 efter RGB-värdet betyder att bildobjektet tonas 50%.

(14)

För kollisionsdetektion använde jag en metod från DisplayObject-klassen i NME.60

Dessvärre upptäckte jag att det endast fungerade när källkoden kompilerades till flash. Till andra plattformar gick applikationen inte att kompileras

överhuvudtaget. Jag fick istället skriva en egen metod. Det finns olika angreppssätt att åstadkomma kollisionsdetektion, jag valde att använda så kallade hitboxes då det verkade enklast. I NME finns en Rectangle-klass med en intersects()-metod som returnerar true eller false huruvida två rektanglar överlappar varandra eller inte.61 Det jag gjorde var att givet bildobjektens höjd

och bredd skapa osynliga rektanglar som omsluter bildobjekten, och på så sätt kunde jag använda intersects()-metoden för att upptäcka kollisioner.

Denna metod har dock en nackdel jämfört med HitTestObject()-metoden och det är att bildobjekten inte är helt rektangulära. Eftersom en rektangel bara är en approximation av ett bildobjekts kontur händer det att kollisioner signaleras trots att ingen kollision har inträffat. Men givet komplexiteten att skapa en bättre metod ansåg jag att denna lösnings var tillräckligt bra.

Kodexempel: Färgtransformation utan Actuate

var redTransformation = new ColorTransformation(1, 1, 1, 1, 255, 0, 0, 0;

var rectangle = new Rectangle(mySprite.x, mySprite.y, mySprite.width, mySprite.height);

mySprite.colorTransform(rectangle, redTransformation);

Variabeln redTransformation är av klassen ColorTransformation och innehåller 8 argument. De 4 första bestämmer multipel, och de 4 sista

bestämmer offset för röd, grön, blå och alpha-värde. Variabeln rectangle är av klassen Rectangle och innehåller bildobjektets position och dimensioner. Variablerna används sedan som argument till funktionen colorTransform.

Kodexempel: Kollisionsdetektion med hitTestObject() if (enemy.hitTestObject(bullet)) {

//Kollision } else {

//Ingen kollision }

Med HitTestObject() returneras värdet true om ett bildobjekt överlappar ett annat bildobjekt medan värdet false returneras om inget överlapp sker.

Kodutdrag: Kollisionsdetektion med intersects()

private function collision(enemy:Entity, bullet:Entity):Bool { var enemyHitbox:Rectangle = new Rectangle(enemy.x, enemy.y, enemy.width, enemy.height);

var bulletHitbox:Rectangle = new Rectangle(bullet.getX() - bullet.width / 2, bullet.getY() - bullet.height / 2,

bullet.width, bullet.height);

return enemyHitbox.intersects(bulletHitbox); }

(15)

För att spara highscore-värdet till lagringsmediet använde jag mig utav SharedObject.

Men för att skriva data för Flash krävdes att en variabel var av datatypen String, medan för C++ och Android så krävdes det att samma variabel inte var en String. Lösningen var att använda villkorlig kompilering.62

Med villkorlig kompilering kompileras olika stycken av kod beroende på parametrar givna till kompilatorn. I NME är parametern vilken plattform som koden kompileras till. Med villkorlig kompilering kunde jag se till att variabeln bara var en String när applikationen kompileras för Flash. På så sätt fungerade det att använda SharedObject på olika plattformar. Villkorlig kompilering liknar tillvägagångssättet att använda olika källkoder för olika plattformar, vilket man vill slippa med plattformsoberoende utveckling. Men skillnaden är att man kan använda samma källkod och endast använda villkorlig kompilering i de fall det är nödvändigt. De plattformsoberoende metoder och datatyper som

Kodexempel: Läs och skriv SharedObjects

För att läsa data.

so = SharedObject.getLocal("highscoreData"); if (so.data.highscore == null) {

so.data.highscore = 0; }

Om det inte finns något värde sparat sätts det till 0. För att spara data.

so.data.highscore = highscore;

var flushStatus:SharedObjectFlushStatus = null; try {

flushStatus = so.flush() ; } catch ( e:Dynamic ) {

trace('Could not write highscore'); }

Kodutdrag: Skriv SharedObjects med villkorlig kompilering so.data.highscore = highscore;

#if ( cpp || neko )

var flushStatus:SharedObjectFlushStatus = null; #else

var flushStatus:String = null; #end

try {

flushStatus = so.flush() ; } catch ( e:Dynamic ) {

trace('Could not write highscore'); }

(16)

ingår i Haxe och NME är gjorda med villkorlig kompilering, men det syns inte för programmeraren.

3.6 Metodkritik

När det gäller programmeringsspråk så kan man i stort sett skapa ett oändligt antal olika applikationer och att testa varenda av dessa är en omöjlighet. Därför finns alltid risken att de tester man utför blir felfria, men att det finns andra tester där fel skulle ha upptäckts. Jag anser dock att risken inte är tillräckligt stor för oro i detta fall.

NME används i huvudsak till spelutveckling och jag anser att utveckla ett komplett spel är en bättre testmetod jämfört med att utveckla många små program som vardera endast har en uppgift att lösa. I ett komplett spel med många uppgifter som ofta görs simultant är det lättare att hitta t.ex. flaskhalsar för prestandan än om man testar allt avskilt.

4 Resultat

4.1 Genomgång av spelet

Här följer två genomgångar av hur spelet fungerar. En i bildformat och en i videoformat.

4.1.1 Annoterade skärmbilder

(17)

4.1.2 Screencast

En screencast som går igenom det färdiga spelet går att beskåda på dessa två länkar. En i wmv-format63 och en i det mer allmänt stödda formatet Flash.

https://www.dropbox.com/s/tfsbb031a89p5aq/screencast.wmv https://www.dropbox.com/s/gea8ecgjas17k0f/screencast.swf

4.2 Funktionalitetsresultat

Jag hade tänkt inkludera Iphone64 som en av testenheterna, men tyvärr så

uppstod det problem med att kompilera applikationen på den MacBook65 jag

fick låna av skolan. Som substitut lät jag en vän kompilera applikation på sin Mac och testa den i Apples Iphone-simulator66.

(18)

Tabell 2. Funktionalitetstest

Inmatningsmetod Ljud Sprites Sparat highscore Windows Flash Tangentbord och mus Ja Ja Ja

Windows C++ Tangentbord och mus Ja Ja Ja Ubuntu Flash Tangentbord och mus Ja Ja Ja Ubuntu C++ Tangentbord och mus Ja Ja Jab

Mac OS X Flash Tangentbord och mus Ja Ja Ja Mac OS X C++ Tangentbord och mus Ja Ja Ja

Android Touchscreen Ja Ja Ja

IOS Simulator Touchscreen (Mus i

simulatorn) Ja Ja Ja

4.3 Skärmbilder

Här följer skärmbilder på spelet när det är igång på de testade plattformarna. Operativsystemens fönsterhanterare ser olika ut men själva spelets utseende förblir den samma.

(19)

Windows Flash

(20)

Ubuntu Flash

(21)

Mac OS X Flash

(22)

Android

IOS Simulator

4.4 Bilduppdateringsfrekvenser

För att mäta bilduppdateringsfrekvenserna använde jag FPS-mätaren jag implementerade och spelade tills jag nådde fiendevåg 14 så att den

genomsnittliga frekvensen haft tid att stabilisera sig. Skärmbilderna ovan kan vara tagna innan fiendevåg 14 och kan därför visa ett annat värde än de som uppmätts.

Hårdvaran jag använde för att mäta bilduppdateringsfrekvenserna för Flash, C+ + i Windows och C++ i Ubuntu var en PC med en Intel Core i5-2500K CPU @ 3.30GHz, 8GB internminne och ett NVIDIA GeForce GTX 560 Ti grafikkort.

(23)

I Windows var versionen av Adobe Flash 11.1.102.63 och i Ubuntu var versionen 11.2.202.236. Versionen av Windows var Windows 7 64-bit SP1. Distributionen av Linux var Ubuntu 12.04 Precise Pangolin LTS.

Tabell 3. Mätresultat av bilduppdateringsfrekvenser för olika plattformar givet samma PC-hårdvara

Min FPS Max FPS Genomsnittlig FPS

Flash i Windows 57 62 59.988

Flash i Ubuntu 60 61 60,61

C++ i Windows 37 51 49.123

C++ i Ubuntu 49 56 50.427

Hårdvaran jag använde för att mäta bilduppdateringsfrekvenserna för Flash och C++ i Mac OS X var en MacBook Pro med en Intel Core 2 Duo CPU @ 2.53 GHz, 4GB internminne och ett NVIDIA GeForce 9400M grafikkort.

I Mac OS X var versionen av Adobe Flash 10.3.182.11. Versionen av Mac OS X var 10.5.8 Leopard.

Tabell 4. Mätresultat av bilduppdateringsfrekvenser för olika plattformar givet samma PC-hårdvara

Min FPS Max FPS Genomsnittlig FPS

Flash i Mac OS X 59 63 60.316

C++ i Mac OS X 48 57 50.832

Flash i Windows Flash i Ubuntu C++ i Windows C++ i Ubuntu 0 10 20 30 40 50 60 70

Figur 3. Jämförelse av bilduppdateringsfrekvenser för olika plattformar på samma PC-hårdvara min FPS max FPS genomsnittlig FPS F P S

(24)

Android-enheten jag använde var en ZTE Light67 (ZTE V9) med firmware

Cyanogenmod68 7.2.0 RC2 som baseras på Android 2.3 Gingerbread.

Hårdvaran som användes för att mäta bilduppdateringsfrekvenserna i Iphone simulatorn var en Mac med en Intel Xeon CPU @ 2.8 GHz, 6GB internminne och ett ATI Radeon 5770 HD grafikkort. Mac OS X versionen var 10.6.8 Snow Leopard.

Tabell 5. Mätresultat av bilduppdateringsfrekvenser för olika plattformar med olika hårdvara

Min FPS Max FPS Genomsnittlig FPS ZTE Light

(Android)

29 60 47.750

Iphone simulator 48 57 50.83

5 Diskussion

Som jag klargjorde i avgränsningarna så har jag inte gjort några försök till att optimera min kod. Det är därför möjligt att ändringar i koden kunde ha gett högre mätresultat. Men avsikten med testet var inte att se hur hög

bilduppdateringsfrekvens som kan uppnås utan att hitta eventuella skillnaderna mellan plattformarna.

Av mätresultatet för PC-hårdvaran kan man se att flash i genomsnitt ligger väldigt nära det avsedda värdet 60 FPS och att bilduppdateringsfrekvensen inte fluktuerar nämnvärt i både Windows och Ubuntu. C++-versionerna presterar i genomsnitt ca 10 FPS lägre än Flash-varianterna. Fluktuationerna i antalet FPS är större i C++, i synnerhet i Windows.

Av mätresultatet för Mac-hårdvaran ser man ett liknande resultat,

Flash-Flash i Mac OS X C++ i Mac OS X 0 10 20 30 40 50 60 70

Figur 4. Jämförelse av bilduppdateringsfrekvenser på samma Mac-hårdvara

Min FPS Max FPS Genomsnittlig FPS F P S 10 20 30 40 50 60 70

Figur 5. Jämförelse av bilduppdateringsfrekvenser på olika hårdvaror

Min FPS Max FPS Genomsnittlig FPS F P S

(25)

versionen presterar bättre och stabilare än C++-versionen. Sammanfattningsvis så ger Flash en högre och stabilare

bilduppdateringsfrekvens än C++, men C++-versionerna är ändå helt klart spelbara.

De resterande enheterna har olika hårdvara och det går därför inte att att avgöra om skillnader i bilduppdateringsfrekvenserna beror på hårdvara eller på

kompileringen av NME. Jag har ändå valt att inkludera testresultaten då det kan vara intressant att veta hur spelet presterar på olika hårdvaror.

Vad det gäller Android-enheten ZTE Light så uppnås det avsedda värdet 60 FPS ibland men i genomsnitt är bilduppdateringsfrekvensen 47,75 FPS. När det är många bildobjekt samtidigt på skärmen så sänks värdet vilket märks på det minsta uppmätta värdet 29 FPS. Trots tillfälliga fall i

uppdateringsfrekvensen anser jag att det är spelbart. Viktigt att poängtera är att ZTE Light är en budgetmodell från 2010 och att dagens Android-enheter , i synnerhet de i den övre prisklassen, med största sannolikhet presterar bättre. Som nämndes i resultatet kunde jag inte kompilera min applikation till IOS på den MacBook jag fick låna av skolan. Jag bad om hjälp på det officiella forumet för NME men de tips jag fick löste tyvärr inte problemen. Jag bad därför en vän att försöka kompilera applikationen på sin Mac. Det fungerade att testköra i simulatorn men det gick inte att bygga de filer som behövdes för att installera applikation på en fysisk Iphone. Jag har därför inte lyckats testa applikationen på en Iphone, men eftersom den fungerade i simulatorn och borde den sannolikt fungera på IOS-enheter. Mätresultatet från simulatorn beror på den underliggande Mac-hårdvaran och säger därför inget om prestandan på fysiska enheter.

Efter att ha läst inlägget ”Windows build capped at 50FPS”69 på NME:s

webbforum så verkar det som att alla applikationer som är avsedda att köras i 60 FPS istället körs i cirka 50 FPS när applikationen kompileras med C++. I inlägget nämns bara Windows, men enligt mitt mätresultat så verkar det vara likadant för Ubuntu och Mac OS X. I inlägget skrev Joshua Granick ”... If I set the FPS to 30, it maxes out at 30, evenly. If I set the FPS to 60, it maxes out around 50. If I set it at 100 or so, it maxes at around 61 FPS. ”. Jag bestämde mig för att testa det samma på min applikation. Jag ändrade den avsedda bilduppdateringsfrekvensen från 60 till 100 och kompilerade spelet till Windows med C++ och fick följande resultat:

Tabell 6. Jämförelse av tidigare och nytt mätresultat

Min FPS Max FPS Genomsnittlig FPS

Tidigare värde 37 51 49.123

(26)

Mycket riktigt så blev den nya genomsnittliga bilduppdateringsfrekvensen cirka 60 FPS, och minsta och högsta uppmätta värden blev också högre. Av detta går det att dra slutsatsen att C++-versionernas lägre mätdata beror på en bugg70 som gör att bilduppdateringsfrekvensen för en applikationen inte blir

vad som avsetts. När det avsedda värdet ändrades från 60 FPS till 100 FPS så

Tidigare värde Nytt värde 0 10 20 30 40 50 60 70

Figur 6. Jämförelse av nytt och gammalt värde

Min FPS Max FPS Genomsnittligt FPS F P S

(27)

uppnåddes det avsedda värdet för 60 FPS och därför kan inte prestandaskillnaden bero på att hårdvaran inte räcker till.

Vad det gäller tänkbara alternativa resultat så kan en alternativ applikation ha gett ett annat resultat. Min applikation använde av realistiska skäl inte varenda klass tillgängligt i NME-biblioteket, så det är möjligt att resultatet skulle se annorlunda ut om andra klasser använts. Men de klasser som ingår i min applikation är de som oftast förekommer vid spelutveckling. Att läsa och rita upp bitmap-bilder, att spela upp ljudeffekter och att förflytta bildobjekt över skärmen är fundamentala delar vid utvecklingen av spel och därför är klasser av den typen av större vikt att testa än t.ex. klasser för databashantering. Det är även tänkbart att en mer resurskrävande applikation hade resulterat i annorlunda mätresultat. Det är möjligt att en sådan applikation hade kunnat visat tydligare skillnader i körprestanda plattformarna sinsemellan. Men som jag gjorde klart i avgränsningarna ingår optimering av koden inte i arbetet. Det skulle därför vara svårt att avgöra om eventuella skillnader berodde på en plattforms begränsningar eller om det berodde på ineffektiv kod.

6 Slutsats

Under arbetets gång stötte jag på två fall där min applikation fungerade som den skulle i Flash men inte på andra plattformar. Med andra ord behövde jag spendera tid på att få min källkod att fungera på fler plattformar. Det går emot påståendet på hemsidan för NME som lyder ”You do not need to spend your time messing with cross-platform compatibility, but you also do not have to sacrifice runtime performance or access to platform features.”.ii Enligt samma

påstående så behöver man inte heller offra prestanda, vilket borde stämma om man bortser från bilduppdateringsfrekvens-buggen när C++ används.

Jag stötte även på ett fall där ett kodstycke inte fungerade på samtliga plattformar. En variabeltyp behövde ändras för att fungera i C++, men då slutade funktionen att fungera på övriga plattformar. Jag löste det genom att använda villkorlig kompilering där olika delar av koden kompileras för olika plattformar. Det handlade visserligen endast om en rad kod, men själva syftet med NME är att samma kod ska fungera på alla plattformar. Förhoppningsvis är villkorlig kompilering endast en temporär lösning och att liknande problem rättas till under den fortlöpande utvecklingen av NME. I annat fall kommer NME aldrig att vara 100% plattformsoberoende.

Det gick visserligen inte så problemfritt som hemsidan påstod, men i slutändan resulterade det trots allt i en källkod (med villkorlig kompilering) som gick att kompilera till alla avsedda plattformar. Och det är ingen liten bedrift med tanke på alla hinder som behövts övervinnas för att få samma applikation att kunna exekveras på flertalet olika kombinationer av hårdvaror och operativsystem. Några av de problem jag stötte på under utvecklingens gång är utvecklarna av NME medvetna om. Jag skrev ett inlägg på det officiella forumet angående att Actuate-bibliotekets färgtransformeringsfuntkion endast fungerar i Flash och en av utvecklarna svarade att han skulle se över det.71 Jag skrev även ett inlägg

angående att metoden hitTestObject() endast fungerar i Flash och fick veta att det finns på utvecklarnas att göra-lista.72

(28)

years. Targeting multiple platforms "the right way" is not an easy solution to find, and although we will not promise that NME is the "perfect" solution, its very well the closest thing we've found to that elusive goal.”ii Om NME är det

försök till plattformsoberoende som kommit närmast vet jag inte då jag inte har undersökt andra alternativ och det har heller inte varit en del av arbetet. Men av Showcase-sidan att döma så har utvecklare med hjälp utav NME lyckats skapa flera kommersiella multiplattformspel.73

Min frågeställning var hur väl ett spel skrivet i Haxe med NME är

plattformsoberoende givet att programkoden är den samma och inte modifierad för varje plattform. Svaret jag har kommit fram till är att det finns ett fåtal fall där plattformsoberoendet inte är fullständigt, men de flesta problemen går att kringgå, och givet att de plattformar man vill utveckla till stödjs av NME så går det sannolikt att distribuera sin applikation till dessa från samma källkod, dock kan villkorlig kompilering behövas användas i viss mån.

Vad det gäller körningsprestandan plattformarna sinsemellan så verkar likvärdig hårdvara ge likvärdig prestanda, med undantag av applikationer kompilerade med C++. Det visade sig dock bero på en bugg som

(29)

Referenser

1 What is a computer? - Definition from WhatIs.com (2012). [www]

<http://searchwinit.techtarget.com/definition/computer> Hämtat 5/7 2012.

2 smartphone | Nationalencyklopedin (2012). [www] <http://www.ne.se/smartphone> Hämtat 5/7 2012. 3 Apple – iOS 5 – Över 200 nya funktioner för iPad, iPhone och iPod touch. (2012). [www]

<http://www.apple.com/se/ios/> Hämtat 5/7 2012.

4 Android | Nationalencyklopedin (2012). [www] <http://www.ne.se/android/1915967> Hämtat 5/7 2012. 5 About ARM – ARM (2012). [www] <http://arm.com/about/index.php> Hämtat 5/7 2012.

6 Haxe Introduction – Haxe (2012). [www] <http://haxe.org/doc/intro> Hämtat 8/5 2012.

7 NME :: Create high-performance Windows, Mac, Linux, IOS, Android, webOS, Flash and HTML5 applications,

written with Haxe (2012). [www] <http://www.haxenme.org>Hämtat 23/4 2012.

8 NME :: About (2012). [www] <http://www.haxenme.org/documentation/about/> Hämtat 8/5 2012. 9 What is fps (frames per second)? - Definition from WhatIs.com (2012). [www]

<http://whatis.techtarget.com/definition/fps-frames-per-second> Hämtat 5/7 2012.

10 Windows | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/windows> Hämtat 5/7 2012. 11 About Ubuntu | Ubuntu (2012). [www] <http://www.ubuntu.com/project/about-ubuntu> Hämtat 5/7 2012. 12 Apple - OS X Lion – Världens mest avancerade operativsystem för datorer. (2012). [www]

<http://www.apple.com/se/macosx/> Hämtat 5/7 2012. 13 Flash Player | Adobe Flash Player 11 \ Overview (2012). [www]

<http://www.adobe.com/se/products/flashplayer.html> Hämtat 5/7 2012.

14 C++ | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/c/147903> Hämtat 5/7 2012. 15 What is Screencasting? – O´Reilly Media (2012). [www]

<http://digitalmedia.oreilly.com/pub/a/oreilly/digitalmedia/2005/11/16/what-is-screencasting.html?page=1> Hämtat 30/6 2012.

16 About Us (2012). [www] <http://whatis.techtarget.com/about> Hämtat 5/7 2012.

17 Stallings (2011). Operating Systems: Internals and Design Principles. Prentice Hall. 7. uppl. s. 8. 18 Silberschatz, Galvin & Gagne (2005). Operating System Concepts. John Wiley & Sons. 7. uppl. s. 6. 19 Ibid. s. 43.

20 Ibid. s. 44-46.

21 Stallings (2011). Operating Systems: Internals and Design Principles. Prentice Hall. 7. uppl. s. 50.

22 ODBC – Open Database Connectivity Overview (2012). [www] <http://support.microsoft.com/kb/110093> Hämtat 5/7 2012.

23 SQL | Nationalencyklopedin (2012). [www] <http://www.ne.se/sql> Hämtat 5/7 2012. 24 OpenGL Overview (2012). [www] <http://www.opengl.org/about/> Hämtat 5/7 2012. 25 DirectX: vanliga frågor och svar (2012). [www]

<http://windows.microsoft.com/sv-SE/windows7/DirectX-frequently-asked-questions> Hämtat 5/7 2012. 26 Standard and Special Edition Consoles – Xbox.com (2012). [www]

<http://www.xbox.com/sv-SE/xbox360/consoles?xr=shellnav> Hämtat 5/7 2012.

27 drivrutin | Nationalencyklopedin (2012).[www] <http://www.ne.se/lang/drivrutin> Hämtat 8/7 2012. 28 Stallings (2011). Operating Systems: Internals and Design Principles. Prentice Hall. 7. uppl. s. 513. 29 The Objective-C Programming Language: Introduction (2012). [www]

<https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObje ctiveC.html> Hämtat 8/7 2012.

30 Stallings (2011). Operating Systems: Internals and Design Principles. Prentice Hall. 7. uppl. s. 74. 31 Java | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/java/215694> Hämtat 5/7 2012. 32 Stallings (2011). Operating Systems: Internals and Design Principles. Prentice Hall. 7. uppl. s. 159-162. 33 Paul, Tyma (1998). Why are we using JAVA again? I: Communication of the ACM volym 41 nr 6, s. 38-42. 34 fil | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/fil/169162> Hämtat 5/7 2012.

35 Javascript | Nationalencyklopedin (2012). [www] <http://www.ne.se/javascript> Hämtat 5/7 2012. 36 Index [NekoVM] (2012). [www] <http://nekovm.org/> Hämtat 5/7 2012.

37 PHP | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/php/1887379> Hämtat 5/7 2012. 38 C | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/c/139917?i_h_word=c sharp>

Hämtat 5/7 2012.

39 HP USA | Mobile Products for Consumers, Professionals, and Businesses [www] <http://www.hpwebos.com/us/> Hämtat 19/6 2012.

40 BlackBerry – Official BlackBerry – Tablets – Smartphones – Cell phones – Mobile Phones – Apps at BlackBerry US

(30)

Referenser

41 Macintosh | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/macintosh> Hämtat 5/7 2012. 42 Linux | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/linux> Hämtat 5/7 2012.

43 HTML5 (2012). [www] <http://www.w3.org/TR/html5/> Hämtat 5/7 2012.

44 Missile Command for Atari 2600 (1981) (2012). [www] <http://www.mobygames.com/game/missile-command_> Hämtat 5/7 2012.

45 färgblandning | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/färgblandning> Hämtat 19/6 2012. 46 bildformat | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/bildformat> Hämtat 5/7 2012. 47 Sprite (datorgrafik) – Wikipedia (2012). [www] <http://sv.wikipedia.org/wiki/Sprite_(datorgrafik)> Hämtat

19/6 2012.

48 ActionScript Technology Center | Adobe Developer Connection (2012). [www] <http://www.adobe.com/devnet/actionscript.html> Hämtat 5/7 2012.

49 Granick, Joshua (2012). actuate – Tween library for Actionscript 3 – Google Projekt Hosting [www] <http://code.google.com/p/actuate/> Hämtat 23/4 2012.

50 Tween – Flash glossary | Adobe Developer Connection (2012). [www]

<http://www.adobe.com/devnet/flash/articles/concept_tween.html> Hämtat 5/7 2012.

51 Hitbox – Valve Developer Community (2012). [www] <https://developer.valvesoftware.com/wiki/Hitbox> Hämtat 5/7 2012.

52 TextField (NME API Documentation) (2012). [www] <http://www.haxenme.org/api/types/nme/text/TextField.html> Hämtat 2/5 2012.

53 Download Abduction 2000 1.01 Free – An original truetype font with a shaky feel to it – Softpedia (2012). [www] <http://www.softpedia.com/get/Others/Font-Utils/Abduction-2000.shtml> Hämtat 2/5 2012.

54 Photos of Galaxies (2012). [www] <http://www.space-images.com/photos/galaxy/index.html> Hämtat 8/5 2012. 55 Flash Kit, A Flash Developer Resource for Macromedia Flash 8 and MX Turorials SWF FLA images clipart

Sounds WAVS Animations Help and Support (2012). [www]

<http://www.flashkit.com/soundfx/Mayhem/Rockets/Missile_-Diode111-8760/index.php> Hämtat 8/5 2012.

56 Flash Kit, A Flash Developer Resource for Macromedia Flash 8 and MX Turorials SWF FLA images clipart Sounds WAVS Animations Help and Support (2012). [www]

<http://www.flashkit.com/soundfx/Mayhem/Explosives/Explosio-Diode111-8778/index.php> Hämtat 8/5 2012.

57 Flash Kit, A Flash Developer Resource for Macromedia Flash 8 and MX Turorials SWF FLA images clipart

Sounds WAVS Animations Help and Support (2012). [www]

<http://www.flashkit.com/soundfx/Mayhem/Explosives/Barrel_e-kayden_r-8962/index.php> Hämtat 8/5 2012.

58 Adobe – Adobe Flash Player : What Is a Local Shared Object? (2012). [www] <http://www.adobe.com/security/flashplayer/articles/lso/> Hämtat 5/7 2012. 59 What is aspect ratio? - Definition from WhatIs.com (2012). [www]

<http://whatis.techtarget.com/definition/aspect-ratio> Hämtat 19/6 2012. 60 DisplayObject (NME API Documentation) (2012). [www]

<http://www.haxenme.org/api/types/nme/display/DisplayObject.html> Hämtat 2/5 2012. 61 Rectangle (NME API Documentation) (2012). [www]

<http://www.haxenme.org/api/types/nme/geom/Rectangle.html> Hämtat 2/5 2012.

62 Conditional Compilation - Haxe (2012). [www] <http://haxe.org/ref/conditionals> Hämtat 5/7. 63 Windows Media Codecs (2012). [www]

<http://msdn.microsoft.com/en-us/library/windows/desktop/ff819508%28v=vs.85%29.aspx> Hämtat 5/7 2012. 64 iPhone | Nationalencyklopedin (2012). [www] <http://www.ne.se/lang/iphone> Hämtat 5/7 2012.

65 Apple -Support – Macbook (2012). [www] <http://www.apple.com/se/support/macbook/> Hämtat 5/7 2012. 66 iOS Developer Program - Apple Developer (2012). [www] <https://developer.apple.com/programs/ios/>

Hämtat 5/7 2012.

67 (2012). [www] <http://www.ztesweden.se/Exego.aspx?p_id=326> Hämtat 19/6 2012.

68 About the project | CyanogenMod (2012). [www] <http://www.cyanogenmod.com/about> Hämtat 5/7 2012. 69 NME :: Windows build capped at 50FPS (2012). [www]

<http://www.haxenme.org/community/forums/installing-nme/windows-build-capped-at-50fps/> Hämtat 27/6 2012.

(31)

Referenser

71 NME :: Using actuate to color tint bitmaps only works on flash target (2012). [www]

< http://www.haxenme.org/community/forums/general-discussion/using-actuate-to-color-tint-bitmaps-only-works-on-flash-target/#4124> Hämtat 8/5 2012.

72 NME :: Sprite.hitTestObject() only working when targeting flash. Working as intented? (2012). [www] < http://www.haxenme.org/community/forums/general-discussion/sprite.hittestobject-only-working-when-targeting-flash.-working-/#4342> Hämtat 8/5 2012.

(32)

På svenska

Detta dokument hålls tillgängligt på Internet – eller dess framtida ersättare –

under en längre tid från publiceringsdatum under förutsättning att inga

extra-ordinära omständigheter uppstår.

Tillgång till dokumentet innebär tillstånd för var och en att läsa, ladda ner,

skriva ut enstaka kopior för enskilt bruk och att använda det oförändrat för

ickekommersiell forskning och för undervisning. Överföring av upphovsrätten

vid en senare tidpunkt kan inte upphäva detta tillstånd. All annan användning av

dokumentet kräver upphovsmannens medgivande. För att garantera äktheten,

säkerheten och tillgängligheten finns det lösningar av teknisk och administrativ

art.

Upphovsmannens ideella rätt innefattar rätt att bli nämnd som upphovsman i

den omfattning som god sed kräver vid användning av dokumentet på ovan

beskrivna sätt samt skydd mot att dokumentet ändras eller presenteras i sådan

form eller i sådant sammanhang som är kränkande för upphovsmannens litterära

eller konstnärliga anseende eller egenart.

För ytterligare information om Linköping University Electronic Press se

förlagets hemsida

http://www.ep.liu.se/

In English

The publishers will keep this document online on the Internet - or its possible

replacement - for a considerable time from the date of publication barring

exceptional circumstances.

The online availability of the document implies a permanent permission for

anyone to read, to download, to print out single copies for your own use and to

use it unchanged for any non-commercial research and educational purpose.

Subsequent transfers of copyright cannot revoke this permission. All other uses

of the document are conditional on the consent of the copyright owner. The

publisher has taken technical and administrative measures to assure authenticity,

security and accessibility.

According to intellectual property law the author has the right to be

mentioned when his/her work is accessed as described above and to be protected

against infringement.

For additional information about the Linköping University Electronic Press

and its procedures for publication and for assurance of document integrity,

please refer to its WWW home page:

http://www.ep.liu.se/

References

Related documents

I familjecentrerad omvårdnad ses familjen som ett system och i familjerela- terad omvårdnad är personen/patienten i centrum för vård och omsorg men hänsyn tas till hens

Alla studier som utvärderat effekter av olika former av sjukgym- nastiska interventioner innehållande information till och träning av patienter som skulle genomgå buk-

Trots att intresset för att främja fysisk akti- vitet har ökat inom sjukvården, där såväl pro- fessionella organisationer som hälso- och sjuk- vårdspersonal tycks bli mer

a cerebri media dx/sin -hö/vä mellersta storhjärnartären a cerebri anterior dx/sin -hö/vä främre storhjärnartär a cerebri posterior dx/sin -hö/vä bakre storhjärnartär.

• SFMGs arbetsgrupp för NGS-baserad diagnostik vid ärftliga tillstånd har under året arbetat fram dokument rörande hantering av oväntade genetiska fynd, mall för

Låt oss därför för stunden bortse från bostadspriser och andra ekonomiska variabler som inkomster, räntor och andra kostnader för att bo och en- bart se till

De kommunala bostadsföretagens omedelbara kostnader för att avveckla drygt 3 600 lägenheter för att nå balans på bostadsmarknaden i de kommuner som är mycket

På detta utdrag från detaljplanen för västra angöringen vid Lunds C finns särskilt angiven cykelparkering ”cykelp” både på allmän plats (parkmark) och