final work - introduction to android

Upload: contact5282

Post on 03-Apr-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/28/2019 Final Work - Introduction to Android.

    1/81

    Introduktion till Android

    programmering

    2013

    ANDROIDPROGRAMMERING FRN GRUNDENJAWED LALEE

    JB GYMNASIET | 2013-04-25

  • 7/28/2019 Final Work - Introduction to Android.

    2/81

    Introduktion till Android

    JAWED LALEE 1

    INNEHLLInnehll.......................................................................................................................................................... 1

    1 Inledning .................................................................................................................................................. 3

    1.1 Syfte ................................................................................................................................................. 31.2 Problemstllning .............................................................................................................................. 3

    1.3 Metod ............................................................................................................................................... 3

    1.4 Material ............................................................................................................................................ 3

    2 Huvuddel ................................................................................................................................................. 4

    2.1 Introduktra frklaringar ................................................................................................................. 4

    2.2 Grundlggande arbete ..................................................................................................................... 4

    2.2.1 Projektid och planering ........................................................................................................... 4

    2.2.2 Var brjan man? ........................................................................................................................ 52.2.3 Frsta applikation ..................................................................................................................... 5

    2.3 Genomfrande arbete ..................................................................................................................... 7

    2.3.1 Grunden fr projektet ............................................................................................................... 7

    2.3.2 NPC, AI, och banor .................................................................................................................. 10

    2.3.3 Android ramverk ..................................................................................................................... 12

    2.3.4 Android, Java och port. ........................................................................................................... 14

    2.3.5 DoxyGen .................................................................................................................................. 14

    2.4 Slutfrande arbete ......................................................................................................................... 15

    2.4.1 Grafiska resurser och felskning ............................................................................................. 15

    2.4.2 Mssan .................................................................................................................................... 16

    3 Avslutande diskussion ........................................................................................................................... 16

    3.1 Hur gick det? .................................................................................................................................. 16

    3.2 Vad kunde ha blivit bttre? ............................................................................................................ 16

    4 Litteratur- och kllfrteckning .............................................................................................................. 17

    4.1 Bcker ............................................................................................................................................ 17

    4.2 Internet .......................................................................................................................................... 17

    4.3 Muntliga kllor ............................................................................................................................... 17

    5 Bilagor ................................................................................................................................................... 18

    5.1 Bilaga 1 Logg ................................................................................................................................... 18

    5.2 Bilaga 2 Hello, World! .................................................................................................................... 22

  • 7/28/2019 Final Work - Introduction to Android.

    3/81

    Introduktion till Android

    JAWED LALEE 2

    5.2.1 MainActivity ............................................................................................................................ 22

    5.2.2 DisplayMessageActivity ........................................................................................................... 23

    5.3 Bilaga 3 GallifreyGameFramework ................................................................................................ 24

    5.3.1 Doctor ...................................................................................................................................... 24

    5.3.2 StartingClass ............................................................................................................................ 27

    5.4 Bilaga 4 GallifreyGame ................................................................................................................ 30

    5.4.1 com.gallifrey ............................................................................................................................ 30

    5.4.2 com.gallifrey.doctor ................................................................................................................ 34

    5.4.3 com.gallifrey.implementation ................................................................................................. 62

  • 7/28/2019 Final Work - Introduction to Android.

    4/81

    Introduktion till Android

    JAWED LALEE 3

    1INLEDNING

    1.1SYFTEAnledningen till att jag valde att gra ett projekt om Androidprogrammering r att jag vill lra mig mer

    om Androidsystemet och utka min frstelse om programmering. Eftersom mobilen anvnds mer och

    mer i vardagen tnkte jag att det kan vara bra att ha kunskap inom det omrdet. Android r det ledande

    operativsystemet fr mobiler just nu och eftersom jag har ven en mobil som har Android s blev det

    den sjlvklara valen fr mitt projekt. Syftet med detta projekt r allts att ka min frstelse fr mobila

    lsningar samt Android och Javaprogrammering.

    1.2PROBLEMSTLLNINGEfter att har lst p lite om Androidprogrammering insg jag snabbt att det kommer bli ett krav att ha enbra struktur p koden. Det r ven ett krav att flja en standard som Google ha infrt. Jag skulle ven

    brja koda i verktyg och sprk som jag inte har arbetat med innan vilket kommer medfra vissa

    svrigheter i brjan.

    1.3METODFr att frbereda mig sjlv s skall jag lsa introduktioner till Android och verktygen som jag kommer

    anvnda mig av. Jag kommer ven behva lsa guider till sjlva SDK som jag kommer anvnda mig av.

    1.4MATERIALJag kommer anvnda mig av Android SDK som Google har gjort tillgngligt. Eclipse kommer vara det

    verktyg som jag kommer anvnda under projektens gng. Jag kommer ven anvnda mig av en Google

    Nexus 4 mobiltelefon.

    Android SDK -http://developer.android.com/sdk/index.html

    Eclipse -http://www.eclipse.org/downloads/

    http://developer.android.com/sdk/index.htmlhttp://developer.android.com/sdk/index.htmlhttp://developer.android.com/sdk/index.htmlhttp://www.eclipse.org/downloads/http://www.eclipse.org/downloads/http://www.eclipse.org/downloads/http://www.eclipse.org/downloads/http://developer.android.com/sdk/index.html
  • 7/28/2019 Final Work - Introduction to Android.

    5/81

    Introduktion till Android

    JAWED LALEE 4

    2HUVUDDEL

    2.1INTRODUKTRA FRKLARINGARJag har valt att indela projektrapporten i tre huvudsakliga delar.Dessa delar kommer vara:

    Grundlggande arbete Genomfrande arbete Slutfrande arbete

    Anledningen till att jag har valt att dela in projektrapporten i dessa delar r att det skall bli enklare fr

    bde mig som frfattare, samt dig som lsare att kunna flja med i projektens arbetsgng.

    Eftersom mitt projekt kommer handla om programmering och det kan krvas att du har ngon

    grundlggande frstelse fr mnet s har jag ven frskt frklara vad olika ord betyder.

    2.2GRUNDLGGANDE ARBETE2.2.1 Projektid och planeringNgot som r vldigt svrt att komma p men ocks enkelt att glmma r sjlva idn fr projekten samt

    vad fr syfte den ska ha. Detta kan vara en av de svraste processerna i hela projektet, samt att det

    kommer avgra vilken standard som den slutgiltiga produkten kommer hlla. Just denna del har varit

    vldigt svrt att utfra eftersom jag tyvrr fick byta projekt under hst terminens gng, detta gjorde attjag fick betydlig mindre skolfrlagt arbetstid fr projekten och krvde att jag planerade istllet vldigt

    mycket tid att arbeta hemma. Eftersom jag har alltid har haft en stor intresse fr programmering och

    teknik s tyckte jag att det skulle vara passande ifall mitt projekt handlade om ngot sdant.

    Jag hann g igenom ett avsevrt antal olika ider innan jag kom fram till min slutgiltiga id. Mobiler,

    mobila lsningar och mobila applikationer r ngot som r vldigt vanligt nu fr tiden och ngot som

    kommer bli allt vanligare i vardagen. Jag sg snabbt att utveckla min frstelse fr mobila lsningar och

    applikationer skulle vara ett bra projekt samt vldigt bra fr min egen framtid inom programmering. Nu

    s brjade min projektid ta form och jag brjade lsa p internet vad som skulle vara en bra

    introduktion till att utveckla mobila lsningar och frst sig p systemet. De sjlvklara svaren var helt

    enkelt att man ska brja med att programmera en enkel mobilapplikation och sedan utveckla vidare.Eftersom jag hade en Google Nexus 4 mobil med Android som operativsystem som blev det snabbt klart

    fr mig att det r Android som jag ska utka min frstelse fr.

  • 7/28/2019 Final Work - Introduction to Android.

    6/81

    Introduktion till Android

    JAWED LALEE 5

    2.2.2 Var brjan man?ven om jag nu hade klart fr mig vad mitt projekt skulle handla om s var det fortfarande vissa

    oklarheter som jag behvde tackla. Jag brjade ska p internet efter ngon introduktion till Android,

    jag kom snabbt fram till att Google har en bra nybrjarguide vilket var en bra introduktion till mnet.

    Jag passade ven p att lsa lite om sjlva Android och kom fram till att Android r utvecklat av ett

    dotterbolag till Google och det r en ledande mobil operativsystem med ppen kllkod vilket gr detvldigt utvecklarvnlig och ltt att anpassa.

    Efter att har lst introduktionen p Androids hemsida bestmde jag mig att brja kolla p de olika

    utvecklarverktygen som dem rekommenderade. En av dessa var sjlvklart deras SDK som behvs fr att

    man ska kunna utveckla mot deras operativsystem. Sedan rekommenderade dem ven Eclipse som

    anvnds mycket inom Javaprogrammering. Android r baserat p en modifierad Linuxkrna och

    operativsystemets programvara bestr av Java-applikationer som drivs p en Javabaserad

    objektorienterad applikationsstruktur ovanp ett javabibliotek. Eclipse blev d ven det sjlvklara valet

    fr utvecklarverktyg.

    Jag bestmde mig att gra en enkel applikation fr att testa Eclipse s att allt funkade. Alla

    programmerare vet att man ska brja med en enkel Hello, World! applikation som frsta program.

    Innan jag kunde brja koda behvde jag installera alla drivrutiner och verktyg som behvdes fr att

    mobilen kunde anvndas fr att felska och testa.

    2.2.3 Frsta applikationHello, World! r ett grundlggande program som ofta anvnds som ett frsta exempel p programkod

    fr nybrjare inom programmering. Androids introduktion guide gick igenom vldigt mnga bra exempel

    p kod stycken och hur man strukturera upp koden i Android. Men dem illustrerade ven hur man

    bygger upp layouten av applikationen med View och ViewGroup.

  • 7/28/2019 Final Work - Introduction to Android.

    7/81

    Introduktion till Android

    JAWED LALEE 6

    Efter lite grundlggande information s brjade jag koda min frsta

    applikation fr Android, eftersom det var en enkel Hello, World!

    applikation s blev klar relativt snabbt, men jag behvde fortfarande f

    det att funka p telefonen.

    Efter lite felskning och testande s fick jag applikationen att starta fr

    frsta gngen. Applikationen fick mig att tnka hur jag ska gra nr

    applikationen gr i vilolge med resurshantering. Jag hade lst p

    tidigare att Android r mycket striktare nr det gller resurser och hur

    applikationen anvnder sagt resurser. Jag noterade detta fr framtida

    projekt.

    Lite kodande till och s hade vi en

    ytterligare funktion dr vi kunde

    skicka sm meddelande i

    applikationen. Nu s sparades

    meddelandet som en variabel och

    sedan s byter applikationen

    view fr att sedan kunna visameddelandet. Hr kan man se hur

    applikationen gr till nsta view

    och visar meddelandet som hade

    sparats ner. Processen kan gras

    om genom att trycka p tillbaka

    knappen.

    Applikationen finns inkluderat i

    bilaga 2.

  • 7/28/2019 Final Work - Introduction to Android.

    8/81

    Introduktion till Android

    JAWED LALEE 7

    2.3GENOMFRANDE ARBETE2.3.1 Grunden fr projektetInnan jag kunde brja koda s behvde jag faststlla ifall jag skulle brja koda direkt mot Android eller

    om jag skulle brja med en Java-applikation som sedan kan portas ver till Android. Portering innebr

    att ett program skrivs om fr att kunna kompileras och fungera p en annan plattform. Guiden som jagtog hjlp av sa att det skulle vara enklare att lra sig om man brjade med en Java applikation, vilket

    gjorde att jag brjade helt enkelt med det. Eftersom projektet kommer vara strre n Hello, World!

    applikationen s tyckte jag att det skulle vara bra ifall jag har en bild illustrerar hur de olika faserna

    kommer utvecklas.

    Under frsta fasen s fick jag vlja ngra grundlggande instllningar fr projektet t.ex. vilken version av

    Java som applikationen ska anvnda under utvecklingen och hur jag skulle strukturera koden.

    Eftersom jag visste att jag skulle senare i utvecklingen porta applikationen till Android behvde jag veta

    ifall Google har ngon speciell kod struktur fr Android. Det visade sig att Android fljer vanligt Java

    paket namnkonventioner. Detta r viktigt att veta eftersom det r vad Android anvnder sig fr att hitta

    rtt skvg internt p enheten.

    Exemplet nedan ger en viss uppfattning hur konventionen fungerar.

    Java Android Android skvgfretag.toppdomn.applikation toppdomn.fretag.applikation toppdomn/fretag/applikationadobe.com.reader com.adobe.reader com/adobe/reader

    Java

    Java applikation.

    Applikationens ramverk i Java.Eventuell felskning och tgrda fel.

    Androidramverk

    Android ramverk.

    Grundlggande ramverk fr applikationen s den fungerar i en Android milj.Eventuell felskning och tgrda fel.

    Android

    Android applikation.

    Med hjlp av Android ramverket ska applikationen portas frn vanligt Java tillAndroid applikation.

    Eventuell felskning och tgrda fel.

  • 7/28/2019 Final Work - Introduction to Android.

    9/81

    Introduktion till Android

    JAWED LALEE 8

    Nu nr jag hade dem grundlggande instllningar klart s bestmde jag mig att brja koda, vilket

    brjade med att jag helt enkelt skapade en ny javapaket som jag dpte GallifreyGameJava. Guiden

    som jag hade brjat flja frklarade klart att det var mnat fr folk som ville lra sig Java s man fick

    komma p och lsa ngra saker sjlv vilket var perfekt fr mig. Jag brjade med tv klasser Doctor.java

    och StartingClass.java. Doctor.java r karaktrens klass som ska hantera sjlva spelarens egenskaper.

    Spelaren spelar Doktorn och karaktren kan g fram, ducka och hoppa. Eftersom spelet kommer vara

    en 2D sidescrolling spel s kommer jag behva rulla bakgrunden och det innebr att jag kommer

    behva ngot som ocks tar hand om sjlva spelets logik.

    StartingClass.java tar hand om sjlva spelets logik. S som flytta karaktren, flytta bakgrunden, starta

    och stnga ner spelet, rita spelskrmen och flytta bakgrunden. Det r hr som spelets instllningar ocks

    definieras saker som t.ex. skrm upplsning, bakgrundsfrg och spelets titel.

    Nr jag sedan behvde felska och kontrollera att saker fungerade som de ska, s anvnde jag mig av

    konsolen och gjorde att applikationen skrev till den nr den gjorde saker som t.ex. om karaktren gr

    fram och bakgrunden behver flyttas.

  • 7/28/2019 Final Work - Introduction to Android.

    10/81

    Introduktion till Android

    JAWED LALEE 9

    Efter lite felskning s fick jag allt att funka vilket satte grunden fr spelets ramverk. Spelet

    grundlggande funktioner fungerar utmrkt och jag kunde fortstta till nsta fas, vilket innebr att jag

    ska implementera en enkel AI och NPC. AI betyder Artificiell intelligens och dr man kan implementera

    logik fr dator styrda objekt s som NPC vilket str fr Non playable character.

    Bilden nedan r frn frsta fasen i utvecklingen av spelets ramverk. Nedladdning och mer information

    finns i bilaga 3

  • 7/28/2019 Final Work - Introduction to Android.

    11/81

    Introduktion till Android

    JAWED LALEE 10

    2.3.2 NPC, AI, och banorNu var det dags att implementera datorstyrda objekt och ge dem enkla instruktioner som de ska flja.

    Teman med spelet fljer BBC knda science fiction serie Doctor Who. Spelaren r d sjlvklart Doktorn

    och fienden r hans knda rival The Daleks.

    Banorna r relativt enkelt att gra d de r en enkel tilemap, banorna bestr av tv huvud

    komponenter. Det finns en text fil som har instruktioner fr applikationen om vilken tile som den skallanvnda. Om du frestller dig hur en nummer knappsats p ett tangentbord ser ut, 8 representerar

    en tile med grs p ovan sida och 5 representera en tile utan grs. Mellanslag representerar tomrum.

    En tile r en ruta som har egenskaper i sjlva spelen.

    AI r relativt enkelt i spelet, den gr bara s att fienden dvs. Dalek gr mot spelaren Doktorn och s

    krs en uppdatering som kollar ifall spelaren har kolliderat med fienden.

  • 7/28/2019 Final Work - Introduction to Android.

    12/81

    Introduktion till Android

    JAWED LALEE 11

    Fljande kod gr s fienden fljer spelaren:publicvoid follow() {

    if (centerX < -95 || centerX > 810) {movementSpeed = 0;

    }

    elseif (Math.abs(doctor.getCenterX() - centerX) < 5) {movementSpeed = 0;

    }

    else {

    if (doctor.getCenterX() >= centerX) {movementSpeed = 1;

    } else {movementSpeed = -1;

    }}

    }

    Men allt styrs frn en uppdaterings funktion.publicvoid update() {

    follow();centerX += speedX;speedX = bg.getSpeedX() * 5 + movementSpeed;r.set(centerX - 25, centerY - 25, centerX + 25, centerY + 35);

    if (Rect.intersects(r, Doctor.yellowRed)) {checkCollision();if (GameScreen.livesLeft > 0) {

    GameScreen.livesLeft = 0;}

    }

    }

    Kollision kollas med hjlp av att man kolla ifall boxen runt spelaren och fienden har krockar.privatevoid checkCollision() {

    if (Rect.intersects(r, Doctor.rect)|| Rect.intersects(r, Doctor.rect2)|| Rect.intersects(r, Doctor.rect3)|| Rect.intersects(r, Doctor.rect4)) {

    }}

  • 7/28/2019 Final Work - Introduction to Android.

    13/81

    Introduktion till Android

    JAWED LALEE 12

    2.3.3 Android ramverkRamverket bygger p tre stycken huvud komponenter.

    Spelets grnssnitt. Implementationen av grnssnittet. Spelets ramverk.

    I spelets grnssnitt s initiera vi komponenter som t.ex. ljud eller grafik. Men vi definierar inga

    egenskaper utan vi skapar bara ett skelett t ramverket.

    I Implementationen av grnssnittet s definierar vi instllningar fr komponenter, med andra ord s kan

    man sga att man lgger till muskler till skelettet.

    Nr vi r klar kan vi p ett enkelt stt kalla spelets ramverk s den kan integrerar med Android.

    Fljande implementation r ngra av dem som finns med i ramverket och kan teranvndas fr framtida

    projekt.

    AccelerometerHandler som kan kolla om t.ex. mobilen r vnd till landskap vy eller om man iframtiden lgger till som man styra spelet genom att manipulerar hur mobilen r vnd och lutat.

    AndroidAudio r det som styr ljudet i spelet och kan vldigt enkelt teranvndas. AndroidFastRednerView som helt enkelt renderar spelvrlden. Till skillnad frn Java-

    applikationen s kan jag inte anvnda samma metod dr jag lt applikationen kra i 60 bilder i

    sekunden, i mobilapplikationen s kommer FPS fluktuerar mer eftersom resurserna i mobilen

    inte r ngot nrma det som fanns p datorn.

    Drfr fr jag anvnda mig av en annan teknik som kallas deltaTime. Ifall karaktren gr

    framt och spelet brjar kras lngsamt s kollar deltaTime hur lng tid som har passerat sen

    den sista uppdateringen och anvnda oss av det fr att kalkylerar hur lngt karaktren behverg framt.

    AndroidFileIO tar hand om sparning av data och ger applikationen tkomst till interna resursert.ex. som grafiken t fienden.

    AndroidImage implementerar bilder och grafiska resurser. MultiTouchHandler gr exakt vad namnet freslr den tar hand om touch grnssnittet.

  • 7/28/2019 Final Work - Introduction to Android.

    14/81

    Introduktion till Android

    JAWED LALEE 13

    Eftersom Android r en mobilplattform s

    kan applikationen pausas och aktiveras

    beroende p vad som hnder till telefonen.

    Ifall du fr ett inkommande samtal s mste

    spelet pausas och sedan kunna fortstta

    frn samma punkt. Samma gller nr

    anvndaren trycker p hem knappen,

    applikationen ska kunna hantera det utan

    att krascha eller frysa.

    Bilden till vnster visa hur applikationen

    kommer anvnda sig av fljande funktioner

    fr att uppn ett bra och sker stt att

    kunna pausa och teruppta frn samma

    instans.

    Eftersom mobilen kommer ven krva bort

    vissa resurser till andra saker, s har

    applikationen implementerat smarta

    funktioner som ska gra att applikationen

    kommer att fungerar ven nr det inte finns

    tillrckligt med resurser fr applikationen.

    Aktivitet

    startas

    onCreate()

    onStart() onRestart()

    onResume()

    Aktivitet krs

    onPause()

    Ny aktivitet startat

    Aktivitet

    kommer till

    frgrunden

    Aktivitet r inte synligt lngre

    onStop()

    Aktivitet

    kommer till

    frgrunden

    onDestroy()

    Aktivitet r

    avsluten

  • 7/28/2019 Final Work - Introduction to Android.

    15/81

    Introduktion till Android

    JAWED LALEE 14

    2.3.4 Android, Java och port.Som jag nmnde innan s fljer Android ett strikt namn standard. S det frsta jag fick gra r att ndra

    frn gallifrey.local.framework till com.gallifrey.doctor samt att jag fick implementera Androidramverket

    och spelets grnssnitt frn tidigare.

    Integrationen var relativt enkelt men ngra saker som jag fick gra om som t.ex. spelets grnssnitt som

    anvnde sig av Java kod som inte kommer funka i en Android milj utan ngra mindre justeringar. Men

    det mesta av koden gick att teranvndas.

    Jag har ven brjat med att lgga in grafiska resurser som bakgrundsbilder och lite saker som Android

    krver som t.ex. applikationens ikon, start meny, splashscreen och androidManifest.xml som krvs fr

    att applikationen ska fungera.

    2.3.5 DoxyGenJag anvnder mig av DoxyGen fr att skapa en dokumentation av projektet, jag tycker att fungerar

    vldigt bra och man kan modifiera vldigt mycket s den passar dig. Programmet har std fr mngaolika programmering sprk. Bilden nedan visar hur doxyGen genererar en hemsida med dokumentation

    om ditt projekt.

  • 7/28/2019 Final Work - Introduction to Android.

    16/81

    Introduktion till Android

    JAWED LALEE 15

    2.4SLUTFRANDE ARBETE2.4.1 Grafiska resurser och felskningNu r projektet nsta klar och det nda som kvarstr r att fixa s allt fungerar framtill mssan och

    felska sm buggar och fixa dem ocks. Eftersom mitt ml var inte att ha en AAA spel utan att ha en

    plattform att jobba p och kunna lra mig ifrn s tyckte jag frn brjan att inte satsa allt fr mycket tidp att f spelet snyggt men nu nr jag har gott om tid p mig att fixa lite sm problem och putsa spelet

    innan mssan s bestmde jag mig att jobba p att fixa spelet lite mer.

    Fljande bilder r frn den senaste versionen av applikationen.

    Doktor som r den bl karaktren sls mot en rd Dalek. Spelet kan ocks pausas och starta frn samma

    instans utan att krascha. Ifall spelet mste minimeras s kan man ltt g in och spela genom att trycka

    p spelets ikon i multitask view

  • 7/28/2019 Final Work - Introduction to Android.

    17/81

    Introduktion till Android

    JAWED LALEE 16

    2.4.2 MssanJag frberedde mig relativt dligt infr mssan d jag frskte gra applikationen klar och uppdatera

    grafiken p sjlva spelen. Under mssan s hade jag en kort Powerpoint presentation som gick genom

    Android i helhet. Mnga som kom till min monter blev fascinerat och verraskat att ngot att get sig p

    att programmera, eftersom mnga som kom frbi var vuxna, elever och lrare som aldrig hade

    programmerat innan s vad det roligt att kunna frklara t dem att det r ltt att frst sig p koden ifallman tnkte efter lite. Jag frklarade hur jag felskte fel och hur man behvde pausa applikationen s

    man kan se vad koden gr. Mnga yngre elever tyckte det var coolt med lite Android och

    programmering i helhet. Nr jag stod vid min monter och frklarade till folk hur koden var uppbyggt s

    visste jag att jag hade uppntt mitt ml.

    3AVSLUTANDE DISKUSSION3.1HUR GICK DET?Sjlv tycker jag att jag lyckades uppn vad jag hade som ml. Jag kade min frstelse fr bde Java ochAndroid, ngot som jag absolut kommer ha nytta av i framtiden. Jag tycker att guiden som jag fljde

    gjorde ett bra jobb p att lra ut grunden fr Java och Androidutveckling men ocks gav en chans fr

    lsarna att utveckla lite p egen hand samt att man fick lsa problem som sjlva frfattaren inte har

    kunnat lsa. Dem tre applikationerna som har utvecklas under detta projekt fungerar utmrkt och jag

    lrde mig jtte mycket, allt frn hur man felsker i eclipse till att verkligen frst hur en mobil

    operativsystem hanterar resurser och hur de prioriterar processer.

    Jag tycker att metoden att flja en guide r vldigt effektivt och ngot som folk borde testa ifall dem vill

    lra sig ngot nytt. Ifall ngon vill gra samma projekt som mig s kan de flja lnkarna som jag har

    inkluderat i kllfrteckning.

    Sjlvklart s finna alla applikationer att ladda ner phttp://www.lalee.seDokumentation p GallifreyGame kan ocks komma t phttp://www.lalee.se/bilaga4

    3.2VAD KUNDE HA BLIVIT BTTRE?Ngot som jag kunnat absolut gjort bttre ifall jag hade mer tid skulle vara kvaliteten och vidare

    utvecklingen av spelets grafik, banor och gameplay. Dock s r jag njd hur projektet blev.

    Ngot som folk ska tnkta p r hur bra n du planerar s kan saker hnda som gr att du kommer efter

    i planeringen. Om du inte gillar att dokumentera s kan du anvnda dig av tredje part program som kan

    hjlpa dig men frlita dig inte 100 % p det, det r alltid bra att dokumentera sjlv.

    http://www.lalee.se/http://www.lalee.se/http://www.lalee.se/http://www.lalee.se/bilaga4http://www.lalee.se/bilaga4http://www.lalee.se/bilaga4http://www.lalee.se/bilaga4http://www.lalee.se/
  • 7/28/2019 Final Work - Introduction to Android.

    18/81

    Introduktion till Android

    JAWED LALEE 17

    4LITTERATUR- OCH KLLFRTECKNING4.1BCKERZechner, Mario (2012) Beginning Android Games 2nd edition, Apress, New York City

    4.2INTERNEThttp://developer.android.com/sdk/index.html

    http://java.about.com/od/javasyntax/a/nameconventions.htm

    http://en.wikipedia.org/wiki/Android_(operating_system)

    http://www.quora.com/Android-OS/Why-do-a-majority-of-Android-package-names-begin-with-com

    http://forum.xda-developers.com/showthread.php?t=1661770

    http://forum.xda-developers.com/showthread.php?p=28323110

    http://forum.xda-developers.com/forumdisplay.php?f=524

    4.3MUNTLIGA KLLORSamtal med Lars Sundberg, Android utvecklare p Bosbec AB.

    http://developer.android.com/sdk/index.htmlhttp://developer.android.com/sdk/index.htmlhttp://java.about.com/od/javasyntax/a/nameconventions.htmhttp://java.about.com/od/javasyntax/a/nameconventions.htmhttp://en.wikipedia.org/wiki/Android_(operating_system)http://en.wikipedia.org/wiki/Android_(operating_system)http://www.quora.com/Android-OS/Why-do-a-majority-of-Android-package-names-begin-with-comhttp://www.quora.com/Android-OS/Why-do-a-majority-of-Android-package-names-begin-with-comhttp://forum.xda-developers.com/showthread.php?t=1661770http://forum.xda-developers.com/showthread.php?t=1661770http://forum.xda-developers.com/showthread.php?p=28323110http://forum.xda-developers.com/showthread.php?p=28323110http://forum.xda-developers.com/forumdisplay.php?f=524http://forum.xda-developers.com/forumdisplay.php?f=524http://forum.xda-developers.com/forumdisplay.php?f=524http://forum.xda-developers.com/showthread.php?p=28323110http://forum.xda-developers.com/showthread.php?t=1661770http://www.quora.com/Android-OS/Why-do-a-majority-of-Android-package-names-begin-with-comhttp://en.wikipedia.org/wiki/Android_(operating_system)http://java.about.com/od/javasyntax/a/nameconventions.htmhttp://developer.android.com/sdk/index.html
  • 7/28/2019 Final Work - Introduction to Android.

    19/81

    Introduktion till Android

    JAWED LALEE 18

    5BILAGOR

    5.1BILAGA 1LOGGDen 23 aug -12 09:50 11:10Brjade med loggen, har ven pbrjat med projektet, jag har bestmt mig att gra en LED klocka av

    LED paneler. Detta innebr att jag mste kunna programmera ett kretskort, mste tyvrr konsultera

    med Anders innan jag kan fortstta med projektet.

    Den 30 aug -12 09:50 11:10Har kollat upp vilka programmerings sprk som kan anvndas fr mitt projekt, jag har bestmt att

    anvnda mig av C++, det kommer vara svrt eftersom jag har inte programmerat innan i C++. Har ven

    pratat med Anders om projektet och han gav mig lite tips angende val av kretskort och ngra frgor

    som jag hade angende strmklla.

    Den 6 sep -12 15:50 18:00Jag var tyvrr sjuk idag, men jag brjade leta efter komponenter fr mitt projekt, jag fick fram ett

    ungefr pris p 700 till 800 kronor dock s fanns de flesta av komponenterna p internationella

    webaffrer som t.ex. ebay.com

    Den 13 sep -12 09:50 11:10Jag fick Anders underskrift idag s jag kunde lmna in mitt projekt beskrivning. Jag pratade ven med

    Anders angende komponenterna som jag hittade frra veckan och om budgeten runt projektet. Han

    gav tips p ngra svenska affrer som sljer det jag behver. Jag tror att projektet brja ta fart och snart

    s borde jag brja bestlla komponenter.

    Den 20 sep -12 09:50 11:10Jag fortstter min letande efter komponenter fr mitt projekt, har ftt ett ungefr id om vad som

    behvs fr projektet. Jag borde ha en bestmt plan om vad som behvs nsta vecka. Jag tycker att det

    r rtt jobbigt med mnga delar som finns bara med ett engelskt namn p t.ex. i ett forum och sedan nr

    man ska ska det p en svensk hemsida s r det rtt svrt att hitta det man sker.

    Den 26 sep -12 12:20 13:10Under onsdagen den 26 sep s var jag p mitt APU plats och efter lite diskussion med ngra som jobbar

    dr s har jag bestmt att kanske g med hel annan mikroprocessor, det kanske blir en PIC processor.

    Jag fr diskutera detta med Anders.

    Den 27 sep -12 09:50 11:10Jag fick skjuta upp mina planer p att kpa in mina komponenter fr mitt projekt, igr s diskuterade jag

    mitt projekt arbete med flera av personerna som jobbar p mitt APU plats, vi kom fram att projektet

    kunde bli mycket roligare ifall vi anvnder oss av ett PIC processor och gr en led matris frn grunden

    med hjlp av en sekvens logik. Idag s fortstter jag min jakt efter rtt komponenter.

  • 7/28/2019 Final Work - Introduction to Android.

    20/81

    Introduktion till Android

    JAWED LALEE 19

    Den 1 nov -12 09:50 11:10Jag hittade rtt PIC processor idag samt ngon sort logik av tidigt koncept plan. PIC16F690 r processorn

    jag kommer att anvnda men eftersom det r en PIC processor s har jag ingen val utan jag mste

    anvnda mig av en programmeringskort fr att kunna programmera en PIC processor, dessa kan kosta

    rtt mycket. Hitta ngra p Kjell och Company fr ungefr 500 kr, jag fr diskutera detta med Anders.

    Den 8 nov -12 09:50 11:10Snackade med Anders och det visar sig att det inte finns ngra pengar tillgngligt, detta r vldigt

    konstigt och Anders ska kolla upp det. Jag hoppas att det inte blir ngra problem eftersom jag har hela

    inkp listan klar, samt att jag har lst problemet med programmering kort fr PIC processorn.

    Den 15 nov -12 09:50 11:10Anders har fortfarande inte ftt ngot svar frn rektorn angende pengar till projektet.

    Jag fr kolla ifall jag kan gra inkpslistan billigare s jag kan kpa den sjlv.

    Den 22 nov -12 09:50 11:10Jag vet inte vad jag ska gra om pengar bristen, Anders har informerat mig att han inte fr kpa in ngot

    av ngon budget orsak. Jag vet inte vad jag gra, jag tnker p att kanske byta projekt arbete.

    Den 29 nov -12 14:10 15:30Jag har kolla lite om vad jag kan gra istllet eftersom Anders inte vet om han kommer f pengar fr

    projektet. Vilket r lite surt efter att jag har lagt ner massa tid. Jag tror jag ska gra ngon

    programmering projekt eller kanske g med ngons projekt.

    Den 6 dec -12 09:50 11:10Jag tror jag bestmmer att kanske gra ett nytt projekt istllet fr att vnta, Anders har ingen aning om

    jag ska f pengar fr projektet, jag hoppas att han fr svar frn rektorn snart s jag kan g vidare och

    brja med ett nytt projekt.

    Den 13 dec -12 15:10 15:20Snackade med Anders och tydligen s har rektorn satt kpstopp. Jag hller p att tnka efter nya ider

    fr projekt arbetet. Tror jag ska gra en programmerings projekt, jag har ocks bestllt en Nexus 4

    telefon med Android s jag kanske kan programmera ngot till det.

    Den 19 dec -12 13:00 13:30Pratade med ngra p APU om Androidprogrammering och hur svrt det skulle vara fr en nybrjare att

    brja programmera i Java. Fick lite guider och boktips om vad kan lsa ver lovet.

    JullovJag har tnkt p vad jag gra istllet som projektarbete, Anders verkar inte bryr sig, jag hann prata medFredric och Stefan innan jullovet och jag berttade om problemet med pengar, Stefan kom en lsning

    direkt om att de kunde anvnda sig av programkassan istllet, lite synd att Anders inte kunde nmna

    detta 1 mnad tidigare. Jag har hamnat jtte mycket efter i planeringen och jag tror inte det hjlper att

    kpa in delarna nu eftersom jag aldrig kommer bli klar tills deadlinen, det kommer ta ungefr 1 mnad

    eller mer fr att alla delarna ska komma in och jag var menad att ha alla komponenter innan jullovet

    eller som senast veckan efter lovet.

  • 7/28/2019 Final Work - Introduction to Android.

    21/81

    Introduktion till Android

    JAWED LALEE 20

    Den 10 jan -13 09:5011:10

    Jag har prata med Annica angende ett byte av projekt arbete, hon sa att det var ok s lnge som jag kan

    ha ett frdigt arbete fram till mssan som kommer vara under april. Jag tror jag ska programmera ngot

    i Android men problemet kommer vara att jag har ingen aning hur jag ska gra det, jag tror projektet ska

    ha som ml att bara lra mig grunden i Android eller ngot liknande. Jag fr prata med Fredric och

    Stefan ifall ngon av dem r intresserad av vara min handledare.

    Den 17 jan -13 09:50 11:10Jag pratade hade en lite kort mte med Annica angende min nya id och jag har skrivit en ny

    projektbeskrivning som jag ge till Stefan omgende. I mitt nya projekt s har jag som ml att jag ska ka

    min frstelse av mobila lsningar och Android i helhet, jag tror jag kan uppn detta och sedan redovisa

    genom att kanske programmera ngot samtidigt frhoppningsvis s kan jag hitta en guide eller en bok

    som kan hjlpa mig med detta.

    Den 24 jan -13 09:50 11:10Stefan gick med p att vara min handledare, vi pratade lite kort om hur jag skulle gra projektet

    eftersom jag inte har s mycket tid kvar. Vi gick genom ngra ider och kom fram till att det r kanskebst att jag har ett litet projekt som t.ex. lra mig grunden till Android och Java. Han hade dock ngra

    villkor som jag fick g med p, jag fr spendera mer tid hemma fr att f projektet klar, eftersom jag

    Stefan har lite erfarenhet att arbeta med Android s sa han att jag kanske skulle ta hjlp av en guide

    eller bok eftersom han kommer inte kunna hjlpa mig s mycket. Vi skulle ven ha sm mten under

    programmering klassen.

    Den 30 jan -13 13:00 13:30Jag berttade fr min APU handledare om mitt nya projekt och vad som hade hnt med min gamla, han

    sa att jag skulle prata med Lars eftersom han arbetar mycket med Android. Eftersom Lars inte var dr

    idag s fick jag istllet prata med ngra andra p arbetsplatsen, jag fick mnga bra tips bland annat att

    lsa phttp://forum.xda-developers.com/forumdisplay.php?f=524ifall jag hittar ngra bra guider.

    Den 7 feb -13 16:00 19:00Jag har arbeta mycket med att hitta en bra guide som inte ger fr mycket hjlp samt s har jag frskt

    att f min telefon att funka i felskning.

    Den 13 feb -13 13:00 15:00Jag har pbrjat mitt arbete med en enkel Hello, World! Applikation som fr hoppningsvis ska hjlpa mig

    med att frst grunden i Android. Jag fljer ven Googles guider hur man fr telefonen att funka som

    felsknings maskin och jag har lst problemet som jag hade fra veckan, jag hoppas att projektet blir bra

    eftersom det r roligt att programmera i Eclipse, man fr inte lika mycket hjlp som i Visual Studio.

    Den 16 feb -13 12:20 20:00Jag r klar med mitt Android Hello, World! Applikation och den fungerar utmrkt jag har lagt till lite

    funktioner som gr den lite coolare, jag har ven brjat med att programmera ett strre projekt som ska

    lra mig mer om Android, jag fljer en guide som jag har hittat p ett forum och det verkar vldigt bra

    fr eftersom frfattaren av guiden har gjort det klart att det r fr personer som lra sig Android fr

    frsta gngen och inte vet s mycket om Java heller. Guiden har kllkod ifall man fastnar med jag har

    inte anvnt mig av dem n utan jag tror jag hnger med utan problem.

    http://forum.xda-developers.com/forumdisplay.php?f=524http://forum.xda-developers.com/forumdisplay.php?f=524http://forum.xda-developers.com/forumdisplay.php?f=524http://forum.xda-developers.com/forumdisplay.php?f=524
  • 7/28/2019 Final Work - Introduction to Android.

    22/81

    Introduktion till Android

    JAWED LALEE 21

    Den 23 feb -13 17:00 21:20Jag har laddat ner en PDF p en bok som handlar om Android spel utveckling och jag planerar p att lsa

    lite genom den, s mycket som jag har lst nu s r det en utmrkt bok som gr in i detalj hur saker

    fungerar. Den brja med vldigt enkel grundlggande information nsta som min egen Hello, World!

    Applikation men jag ser att den snabbt gr in mer avancerade saker som 3D och avancerat AI.

    APU 25 feb 22 mars 2013Jag har arbeta mycket med projekten under APU tiden, jag har gjort klart en grund fr spelet som r

    kodat i Java som jag kommer vid senare tillflle porta ver till Android med hjlp av ett framework. Jag

    har ven brjat med frameworket som senare ska anvndas fr att gra s att spelet fungerar i Android.

    Dock s frlorade jag lite arbete nr datorn blev korrupt under APU och jag fick lmna in den hos Rene

    jag hade ngra backups men dem var ungefr 2 veckor gamla. Jag hoppas att detta inte frstr mycket

    fr projeketet.

    Jag har ven arbeta mycket med de mobila lsningar som Bosbec har, det har varit frn att kunna skicka

    meddelande frn datorn till mobilen genom API och deras system till att kunna skicka frgor till mobilen

    frn en web grnssnitt.

    Den 23 mars -13 14:20 22:00Med vara ngra veckor kvar till mssan s har jag ftt arbeta mycket, jag r nstan klart med

    frameworket fr spelet och jag ska snart brja med att programmera ihop allt, guiden som jag har fljt

    har hjlp mig jtte mycket och jag har mycket strre frstelse av visa saker som hade ingen aning om

    innan, t.ex. hur spelet tar han om saker nr det laggar. I alla fall s tror jag ligger relativt klart och jag

    borde f klart allt tills mssan.

    Den 27 mars -13 09:00 16:00Eftersom jag inte kan gra mycket p APU s min handledare dr ltit mig arbeta med projektet s jag

    blir klart till mssan, jag r nstan klart med att brja testa p sjlva mobilen.

    Den 2 april -13 13:30 15:00Jag r nstan klart med projektet och jag behver bara fixa lite bilder och grafiska resurser fr projektet.

    Jag sttte lite problem med att hitta en bra bakgrundsbild fr spelet.

    PsklovUnder psken s var jag klart med sjlva koden och jag har lrt mig mycket frn guiden som jag fljde.

    Jag borde vara helt klart infr mssan om ngon vecka.

    Den 23 april -13 13:30 15:00Sista programmering lektionen innan mssan, jag fick lite problem med drivers till felskning i mobilen.

    Jag har brjat med att skriva rapporten.

  • 7/28/2019 Final Work - Introduction to Android.

    23/81

    Introduktion till Android

    JAWED LALEE 22

    5.2BILAGA 2HELLO,WORLD!

    Nedladdning finns phttp://www.lalee.se/bilaga2

    5.2.1 MainActivitypackage com.example.project1_helloworld;

    import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.widget.EditText;

    publicclass MainActivity extends Activity {publicfinalstatic String EXTRA_MESSAGE =

    "com.example.project1_helloworld.MESSAGE";

    @Overrideprotectedvoid onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

    }

    @Overridepublicboolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.activity_main, menu);returntrue;

    }

    /** Called when the user clicks the Send button */

    com.example.project1_helloworld

    Paket

    DisplayMessageActivity.java

    Vy hanterare

    MainActivity.java

    Skapar meddelande

    http://www.lalee.se/bilaga2http://www.lalee.se/bilaga2http://www.lalee.se/bilaga2http://www.lalee.se/bilaga2
  • 7/28/2019 Final Work - Introduction to Android.

    24/81

    Introduktion till Android

    JAWED LALEE 23

    publicvoid sendMessage(View view) {Intent intent = new Intent(this, DisplayMessageActivity.class);EditText editText = (EditText) findViewById(R.id.edit_message);String message = editText.getText().toString();intent.putExtra(EXTRA_MESSAGE, message);startActivity(intent);

    }}

    5.2.2 DisplayMessageActivitypackage com.example.project1_helloworld;

    import android.annotation.SuppressLint;import android.app.Activity;import android.content.Intent;import android.os.Build;import android.os.Bundle;import android.support.v4.app.NavUtils;import android.view.MenuItem;import android.widget.TextView;

    publicclass DisplayMessageActivity extends Activity {@SuppressLint("NewApi")@Overridepublicvoid onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    // Get the message from the intentIntent intent = getIntent();String message =

    intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text viewTextView textView = new TextView(this);textView.setTextSize(40);textView.setText(message);

    // Set the text view as the activity layoutsetContentView(textView);

    }

    @Overridepublicboolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {case android.R.id.home:// This ID represents the Home or Up button.

    NavUtils.navigateUpFromSameTask(this);returntrue;

    }returnsuper.onOptionsItemSelected(item);

    }

    }

  • 7/28/2019 Final Work - Introduction to Android.

    25/81

    Introduktion till Android

    JAWED LALEE 24

    5.3BILAGA 3GALLIFREYGAMEFRAMEWORK

    Nedladdning finns phttp://www.lalee.se/bilaga3

    5.3.1 Doctorpackage gallifrey.local.framework;import java.awt.Graphics;publicclass Doctor {

    privateintcenterX = 100;privateintcenterY = 382;privatebooleanjumped = false;

    privateintspeedX = 0;privateintspeedY = 1;

    publicvoid update() {

    // Moves Character or Scrolls Background accordingly.if (speedX < 0) {

    centerX += speedX;} elseif (speedX == 0) {

    System.out.println("Flytta inte bakgrunden.");

    } else {if (centerX

  • 7/28/2019 Final Work - Introduction to Android.

    26/81

    Introduktion till Android

    JAWED LALEE 25

    // Updates Y PositioncenterY += speedY;if (centerY + speedY >= 382) {

    centerY = 382;}

    // Handles Jumpingif (jumped == true) {

    speedY += 1;

    if (centerY + speedY >= 382) {centerY = 382;speedY = 0;jumped = false;

    }

    }

    // Prevents going beyond X coordinate of 0

    if (centerX + speedX

  • 7/28/2019 Final Work - Introduction to Android.

    27/81

    Introduktion till Android

    JAWED LALEE 26

    publicint getSpeedX() {returnspeedX;

    }

    publicint getSpeedY() {returnspeedY;

    }

    publicvoid setCenterX(int centerX) {this.centerX = centerX;

    }

    publicvoid setCenterY(int centerY) {this.centerY = centerY;

    }

    publicvoid setJumped(boolean jumped) {this.jumped = jumped;

    }

    publicvoid setSpeedX(int speedX) {this.speedX = speedX;

    }

    publicvoid setSpeedY(int speedY) {this.speedY = speedY;

    }}

  • 7/28/2019 Final Work - Introduction to Android.

    28/81

    Introduktion till Android

    JAWED LALEE 27

    5.3.2 StartingClasspackage gallifrey.local.framework;

    import java.applet.Applet;import java.awt.Color;import java.awt.Frame;

    import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.net.URL;

    publicclass StartingClass extends Applet implements Runnable, KeyListener {

    private Doctor doctor;private Image image, character;private Graphics second;private URL base;

    @Override

    publicvoid init() {

    setSize(800, 480);setBackground(Color.BLACK);setFocusable(true);addKeyListener(this);Frame frame = (Frame) this.getParent().getParent();frame.setTitle("Gallifrey Game");try {

    base = getDocumentBase();} catch (Exception e) {

    // TODO: handle exception}

    // Image Setupscharacter = getImage(base, "data/character.png");

    }

    @Overridepublicvoid start() {

    doctor = new Doctor();

    Thread thread = new Thread(this);thread.start();

    }

    @Overridepublicvoid stop() {

    // TODO Auto-generated method stub}

    @Overridepublicvoid destroy() {

    // TODO Auto-generated method stub}

  • 7/28/2019 Final Work - Introduction to Android.

    29/81

    Introduktion till Android

    JAWED LALEE 28

    @Overridepublicvoid run() {

    while (true) {doctor.update();repaint();try {

    Thread.sleep(17);} catch (InterruptedException e) {

    e.printStackTrace();}

    }}

    @Overridepublicvoid update(Graphics g) {

    if (image == null) {image = createImage(this.getWidth(), this.getHeight());second = image.getGraphics();

    }

    second.setColor(getBackground());second.fillRect(0, 0, getWidth(), getHeight());second.setColor(getForeground());paint(second);

    g.drawImage(image, 0, 0, this);

    }

    @Overridepublicvoid paint(Graphics g) {

    g.drawImage(character, doctor.getCenterX() - 61,doctor.getCenterY() - 63, this);

    }

    @Overridepublicvoid keyPressed(KeyEvent e) {

    switch (e.getKeyCode()) {case KeyEvent.VK_UP:

    System.out.println("Flytta framt");break;

    case KeyEvent.VK_DOWN:System.out.println("Flytta ner");

    break;

    case KeyEvent.VK_LEFT:doctor.moveLeft();break;

    case KeyEvent.VK_RIGHT:doctor.moveRight();break;

  • 7/28/2019 Final Work - Introduction to Android.

    30/81

    Introduktion till Android

    JAWED LALEE 29

    case KeyEvent.VK_SPACE:System.out.println("Hoppa");doctor.jump();break;

    }

    }

    @Overridepublicvoid keyReleased(KeyEvent e) {

    switch (e.getKeyCode()) {case KeyEvent.VK_UP:

    System.out.println("Sluta g framt");break;

    case KeyEvent.VK_DOWN:System.out.println("Sluta g ner");break;

    case KeyEvent.VK_LEFT:doctor.stop();break;

    case KeyEvent.VK_RIGHT:doctor.stop();break;

    case KeyEvent.VK_SPACE:System.out.println("Sluta hoppa");break;

    }

    }

    @Overridepublicvoid keyTyped(KeyEvent e) {

    // TODO Auto-generated method stub

    }

    }

  • 7/28/2019 Final Work - Introduction to Android.

    31/81

    Introduktion till Android

    JAWED LALEE 30

    5.4BILAGA 4GALLIFREYGAMENedladdning av projekt finns phttp://www.lalee.se/bilaga4-download

    Mer information finns phttp://www.lalee.se/bilaga4

    5.4.1 com.gallifreyAudiopackage com.gallifrey;

    publicinterface Audio {public Music createMusic(String file);

    public Sound createSound(String file);}

    FileIOpackage com.gallifrey;

    importjava.io.IOException;import java.io.InputStream;

    import java.io.OutputStream;

    import android.content.SharedPreferences;

    publicinterface FileIO {public InputStream readFile(String file) throws IOException;

    public OutputStream writeFile(String file) throws IOException;

    public InputStream readAsset(String file) throws IOException;

    public SharedPreferences getSharedPref();

    }

    Gamepackage com.gallifrey;

    publicinterface Game {

    public Audio getAudio();

    public Input getInput();

    public FileIO getFileIO();

    public Graphics getGraphics();

    publicvoid setScreen(Screen screen);

    public Screen getCurrentScreen();

    public Screen getInitScreen();}

    http://www.lalee.se/bilaga4-downloadhttp://www.lalee.se/bilaga4-downloadhttp://www.lalee.se/bilaga4-downloadhttp://www.lalee.se/bilaga4http://www.lalee.se/bilaga4http://www.lalee.se/bilaga4http://www.lalee.se/bilaga4http://www.lalee.se/bilaga4-download
  • 7/28/2019 Final Work - Introduction to Android.

    32/81

    Introduktion till Android

    JAWED LALEE 31

    Graphicspackage com.gallifrey;

    import android.graphics.Paint;

    publicinterface Graphics {

    publicstaticenum ImageFormat {ARGB8888, ARGB4444, RGB565}

    public Image newImage(String fileName, ImageFormat format);

    publicvoid clearScreen(int color);

    publicvoid drawLine(int x, int y, int x2, int y2, int color);

    publicvoid drawRect(int x, int y, int width, int height, int color);

    publicvoid drawImage(Image image, int x, int y, int srcX, int srcY,int srcWidth, int srcHeight);

    publicvoid drawImage(Image Image, int x, int y);

    void drawString(String text, int x, int y, Paint paint);

    publicint getWidth();

    publicint getHeight();

    publicvoid drawARGB(int i, int j, int k, int l);

    }

    Imagepackage com.gallifrey;

    import com.gallifrey.Graphics.ImageFormat;

    publicinterface Image {publicint getWidth();

    publicint getHeight();

    public ImageFormat getFormat();

    publicvoid dispose();}

  • 7/28/2019 Final Work - Introduction to Android.

    33/81

    Introduktion till Android

    JAWED LALEE 32

    Inputpackage com.gallifrey;

    import java.util.List;

    publicinterface Input {

    publicstaticclass TouchEvent {publicstaticfinalintTOUCH_DOWN = 0;publicstaticfinalintTOUCH_UP = 1;publicstaticfinalintTOUCH_DRAGGED = 2;publicstaticfinalintTOUCH_HOLD = 3;

    publicinttype;publicintx, y;publicintpointer;

    }

    publicboolean isTouchDown(int pointer);

    publicint getTouchX(int pointer);

    publicint getTouchY(int pointer);

    publicfloat getAccelX();

    publicfloat getAccelY();

    publicfloat getAccelZ();

    public List getTouchEvents();}

    Musicpackage com.gallifrey;

    publicinterface Music {publicvoid play();publicvoid stop();

    publicvoid pause();publicvoid setLooping(boolean looping);

    publicvoid setVolume(float volume);publicboolean isPlaying();publicboolean isStopped();

    publicboolean isLooping();publicvoid dispose();

    void seekBegin();}

  • 7/28/2019 Final Work - Introduction to Android.

    34/81

    Introduktion till Android

    JAWED LALEE 33

    Poolpackage com.gallifrey;

    import java.util.ArrayList;import java.util.List;

    publicclass Pool {publicinterface PoolObjectFactory {public T createObject();

    }

    privatefinal List freeObjects;privatefinal PoolObjectFactory factory;privatefinalintmaxSize;

    public Pool(PoolObjectFactory factory, int maxSize) {this.factory = factory;this.maxSize = maxSize;this.freeObjects = new ArrayList(maxSize);

    }

    public T newObject() {T object = null;

    if (freeObjects.size() == 0)object = factory.createObject();

    elseobject = freeObjects.remove(freeObjects.size() - 1);

    return object;}

    publicvoid free(T object) {

    if (freeObjects.size() < maxSize)freeObjects.add(object);}

    }

    Screenpackage com.gallifrey;

    publicabstractclass Screen {protectedfinal Game game;public Screen(Game game) {

    this.game = game;}

    publicabstractvoid update(float deltaTime);publicabstractvoid paint(float deltaTime);

    publicabstractvoid pause();publicabstractvoid resume();

    publicabstractvoid dispose();publicabstractvoid backButton();

    }

  • 7/28/2019 Final Work - Introduction to Android.

    35/81

    Introduktion till Android

    JAWED LALEE 34

    Soundpackage com.gallifrey;

    publicinterface Sound {publicvoid play(float volume);

    publicvoid dispose();}

    5.4.2 com.gallifrey.doctor

    Animationpackage com.gallifrey.doctor;

    import java.util.ArrayList;

    import com.gallifrey.Image;

    publicclass Animation {

    private ArrayList frames;privateintcurrentFrame;privatelonganimTime;privatelongtotalDuration;

    public Animation() {frames = new ArrayList();totalDuration = 0;

    synchronized (this) {

    animTime = 0;currentFrame = 0;}

    }

    publicsynchronizedvoid addFrame(Image image, long duration) {totalDuration += duration;frames.add(new AnimFrame(image, totalDuration));

    }

    publicsynchronizedvoid update(long elapsedTime) {if (frames.size() > 1) {

    animTime += elapsedTime;if (animTime >= totalDuration) {

    animTime = animTime % totalDuration;currentFrame = 0;

    }

    while (animTime > getFrame(currentFrame).endTime) {currentFrame++;

    }

  • 7/28/2019 Final Work - Introduction to Android.

    36/81

    Introduktion till Android

    JAWED LALEE 35

    }}

    publicsynchronized Image getImage() {if (frames.size() == 0) {

    returnnull;} else {

    return getFrame(currentFrame).image;}

    }

    private AnimFrame getFrame(int i) {return (AnimFrame) frames.get(i);

    }

    privateclass AnimFrame {

    Image image;longendTime;

    public AnimFrame(Image image, long endTime) {this.image = image;this.endTime = endTime;

    }}

    }

    Assetspackage com.gallifrey.doctor;

    publicclass Background {

    privateintbgX, bgY, speedX;

    public Background(int x, int y) {bgX = x;bgY = y;speedX = 0;

    }

    publicvoid update() {bgX += speedX;

    if (bgX

  • 7/28/2019 Final Work - Introduction to Android.

    37/81

    Introduktion till Android

    JAWED LALEE 36

    publicint getSpeedX() {returnspeedX;

    }

    publicvoid setBgX(int bgX) {this.bgX = bgX;

    }

    publicvoid setBgY(int bgY) {this.bgY = bgY;

    }

    publicvoid setSpeedX(int speedX) {this.speedX = speedX;

    }

    }

    Backgroundpackage com.gallifrey.doctor;

    publicclass Background {

    privateint bgX, bgY, speedX;

    public Background(int x, int y) {bgX = x;bgY = y;speedX = 0;

    }

    publicvoid update() {bgX += speedX;

    if (bgX

  • 7/28/2019 Final Work - Introduction to Android.

    38/81

    Introduktion till Android

    JAWED LALEE 37

    this.bgY = bgY;}

    publicvoid setSpeedX(int speedX) {this.speedX = speedX;

    }

    }

    Dalekpackage com.gallifrey.doctor;

    publicclass Dalek extends Enemy {

    public Dalek(int centerX, int centerY) {

    setCenterX(centerX);setCenterY(centerY);

    }

    }

    Doctorpackage com.gallifrey.doctor;

    import java.util.ArrayList;

    import android.graphics.Rect;

    publicclass Doctor {

    // Constants are here

    finalintgravityAcceleration = -15;finalintmovementSpeed = 5;

    privateintcenterX = 100;privateintcenterY = 377;privatebooleanjumped = false;privatebooleanmovingLeft = false;privatebooleanmovingRight = false;privatebooleanducked = false;privatebooleanreadyToFire = true;

    privateintspeedX = 0;privateintspeedY = 0;publicstatic Rect rect = new Rect(0, 0, 0, 0);

    publicstatic Rect rect2 = new Rect(0, 0, 0, 0);publicstatic Rect rect3 = new Rect(0, 0, 0, 0);publicstatic Rect rect4 = new Rect(0, 0, 0, 0);publicstatic Rect yellowRed = new Rect(0, 0, 0, 0);

    publicstatic Rect footleft = new Rect(0, 0, 0, 0);publicstatic Rect footright = new Rect(0, 0, 0, 0);

    private Background bg1 = GameScreen.getBg1();

  • 7/28/2019 Final Work - Introduction to Android.

    39/81

    Introduktion till Android

    JAWED LALEE 38

    private Background bg2 = GameScreen.getBg2();

    private ArrayList projectiles = new ArrayList();

    publicvoid update() {// Moves Character or Scrolls Background accordingly.

    if (speedX < 0) {centerX += speedX;

    }if (speedX == 0 || speedX < 0) {

    bg1.setSpeedX(0);bg2.setSpeedX(0);

    }if (centerX 0) {

    centerX += speedX;}if (speedX > 0 && centerX > 200) {

    bg1.setSpeedX(-movementSpeed / 5);

    bg2.setSpeedX(-movementSpeed / 5);}

    // Updates Y PositioncenterY += speedY;

    // Handles Jumping

    speedY += 1;

    if (speedY > 3) {jumped = true;

    }

    // Prevents going beyond X coordinate of 0if (centerX + speedX

  • 7/28/2019 Final Work - Introduction to Android.

    40/81

    Introduktion till Android

    JAWED LALEE 39

    }}

    publicvoid moveLeft() {if (ducked == false) {

    speedX = -movementSpeed;}

    }

    publicvoid stopRight() {setMovingRight(false);stop();

    }

    publicvoid stopLeft() {setMovingLeft(false);stop();

    }

    privatevoid stop() {

    if (isMovingRight() == false && isMovingLeft() == false) {speedX = 0;

    }

    if (isMovingRight() == false && isMovingLeft() == true) {moveLeft();

    }

    if (isMovingRight() == true && isMovingLeft() == false) {moveRight();

    }

    }

    publicvoid jump() {if (jumped == false) {

    speedY = gravityAcceleration;jumped = true;

    }

    }

    publicvoid shoot() {if (readyToFire) {

    Projectile p = new Projectile(centerX + 50, centerY - 25);projectiles.add(p);

    }

    }

    publicint getCenterX() {returncenterX;

    }

    publicint getCenterY() {returncenterY;

    }

  • 7/28/2019 Final Work - Introduction to Android.

    41/81

    Introduktion till Android

    JAWED LALEE 40

    publicboolean isJumped() {returnjumped;

    }

    publicint getSpeedX() {returnspeedX;

    }

    publicint getSpeedY() {returnspeedY;

    }

    publicvoid setCenterX(int centerX) {this.centerX = centerX;

    }

    publicvoid setCenterY(int centerY) {this.centerY = centerY;

    }

    publicvoid setJumped(boolean jumped) {this.jumped = jumped;

    }

    publicvoid setSpeedX(int speedX) {this.speedX = speedX;

    }

    publicvoid setSpeedY(int speedY) {this.speedY = speedY;

    }

    publicboolean isDucked() {returnducked;

    }

    publicvoid setDucked(boolean ducked) {this.ducked = ducked;

    }

    publicboolean isMovingRight() {returnmovingRight;

    }

    publicvoid setMovingRight(boolean movingRight) {this.movingRight = movingRight;

    }

    publicboolean isMovingLeft() {returnmovingLeft;

    }

    publicvoid setMovingLeft(boolean movingLeft) {this.movingLeft = movingLeft;

    }

  • 7/28/2019 Final Work - Introduction to Android.

    42/81

    Introduktion till Android

    JAWED LALEE 41

    public ArrayList getProjectiles() {returnprojectiles;

    }

    publicboolean isReadyToFire() {returnreadyToFire;

    }

    publicvoid setReadyToFire(boolean readyToFire) {this.readyToFire = readyToFire;

    }

    }

    Enemypackage com.gallifrey.doctor;

    import android.graphics.Rect;

    publicclass Enemy {

    privateintpower, centerX, speedX, centerY;private Background bg = GameScreen.getBg1();private Doctor doctor = GameScreen.getRobot();

    public Rect r = new Rect(0, 0, 0, 0);publicinthealth = 5;

    privateintmovementSpeed;

    // Behavioral Methodspublicvoid update() {

    follow();centerX += speedX;speedX = bg.getSpeedX() * 5 + movementSpeed;r.set(centerX - 25, centerY - 25, centerX + 25, centerY + 35);

    if (Rect.intersects(r, Doctor.yellowRed)) {checkCollision();if (GameScreen.livesLeft > 0) {

    GameScreen.livesLeft = 0;}

    }

    }

    privatevoid checkCollision() {if (Rect.intersects(r, Doctor.rect) || Rect.intersects(r,

    Doctor.rect2)|| Rect.intersects(r, Doctor.rect3)|| Rect.intersects(r, Doctor.rect4)) {

    }}

  • 7/28/2019 Final Work - Introduction to Android.

    43/81

    Introduktion till Android

    JAWED LALEE 42

    publicvoid follow() {

    if (centerX < -95 || centerX > 810) {movementSpeed = 0;

    }

    elseif (Math.abs(doctor.getCenterX() - centerX) < 5) {movementSpeed = 0;

    }

    else {

    if (doctor.getCenterX() >= centerX) {movementSpeed = 1;

    } else {movementSpeed = -1;

    }}

    }

    publicvoid die() {

    }

    publicvoid attack() {

    }

    publicint getPower() {returnpower;

    }

    publicint getSpeedX() {returnspeedX;

    }

    publicint getCenterX() {returncenterX;

    }

    publicint getCenterY() {returncenterY;

    }

    public Background getBg() {returnbg;

    }

    publicvoid setPower(int power) {this.power = power;

    }

    publicvoid setSpeedX(int speedX) {this.speedX = speedX;

    }

  • 7/28/2019 Final Work - Introduction to Android.

    44/81

    Introduktion till Android

    JAWED LALEE 43

    publicvoid setCenterX(int centerX) {this.centerX = centerX;

    }

    publicvoid setCenterY(int centerY) {this.centerY = centerY;

    }

    publicvoid setBg(Background bg) {this.bg = bg;

    }

    }

    GameScreenpackage com.gallifrey.doctor;

    import java.util.ArrayList;import java.util.List;

    import java.util.Scanner;

    import android.graphics.Color;import android.graphics.Paint;import com.gallifrey.Game;import com.gallifrey.Graphics;import com.gallifrey.Image;import com.gallifrey.Screen;import com.gallifrey.Input.TouchEvent;

    publicclass GameScreen extends Screen {enum GameState {

    Ready, Running, Paused, GameOver

    }

    GameState state = GameState.Ready;

    // Variable Setup

    privatestatic Background bg1, bg2;privatestatic Doctor doctor;publicstatic Dalek hb, hb2;

    private Image currentSprite, character, character2, character3, heliboy,heliboy2, heliboy3, heliboy4, heliboy5;

    private Animation anim, hanim;

    private ArrayList tilearray = new ArrayList();

    publicstaticintlivesLeft = 1;Paint paint, paint2;

    public GameScreen(Game game) {super(game);// Load SettingsSettings.load(game.getFileIO());

  • 7/28/2019 Final Work - Introduction to Android.

    45/81

    Introduktion till Android

    JAWED LALEE 44

    // Initialize game objects here

    bg1 = new Background(0, 0);bg2 = new Background(2160, 0);doctor = new Doctor();hb = new Dalek(340, 360);hb2 = new Dalek(700, 360);

    character = Assets.character;character2 = Assets.character2;character3 = Assets.character3;

    heliboy = Assets.heliboy;heliboy2 = Assets.heliboy2;heliboy3 = Assets.heliboy3;heliboy4 = Assets.heliboy4;heliboy5 = Assets.heliboy5;

    anim = new Animation();anim.addFrame(character, 1250);

    anim.addFrame(character2, 50);anim.addFrame(character3, 50);anim.addFrame(character2, 50);

    hanim = new Animation();hanim.addFrame(heliboy, 100);hanim.addFrame(heliboy2, 100);hanim.addFrame(heliboy3, 100);hanim.addFrame(heliboy4, 100);hanim.addFrame(heliboy5, 100);hanim.addFrame(heliboy4, 100);hanim.addFrame(heliboy3, 100);hanim.addFrame(heliboy2, 100);

    currentSprite = anim.getImage();

    loadMap();

    // Defining a paint objectpaint = new Paint();paint.setTextSize(30);paint.setTextAlign(Paint.Align.CENTER);paint.setAntiAlias(true);paint.setColor(Color.WHITE);

    paint2 = new Paint();paint2.setTextSize(100);

    paint2.setTextAlign(Paint.Align.CENTER);paint2.setAntiAlias(true);paint2.setColor(Color.WHITE);

    }

    privatevoid loadMap() {ArrayList lines = new ArrayList();int width = 0;

  • 7/28/2019 Final Work - Introduction to Android.

    46/81

    Introduktion till Android

    JAWED LALEE 45

    int height = 0;Scanner scanner;

    if (Settings.currentLevel == 0) {scanner = new Scanner(SampleGame.map);System.out.println("THIS");

    } elseif (Settings.currentLevel == 1) {scanner = new Scanner(SampleGame.map2);System.out.println("THAT");

    } else {// DEFAULT VALUE IN CASE OF ERROR.scanner = new Scanner(SampleGame.map);System.out.println("OTHER");

    }

    System.out.println(Settings.currentLevel);

    while (scanner.hasNextLine()) {String line = scanner.nextLine();

    // no more lines to readif (line == null) {

    break;}

    if (!line.startsWith("!")) {lines.add(line);width = Math.max(width, line.length());

    }}height = lines.size();

    for (int j = 0; j < height; j++) {String line = (String) lines.get(j);for (int i = 0; i < width; i++) {

    if (i < line.length()) {char ch = line.charAt(i);Tile t = new Tile(i, j,

    Character.getNumericValue(ch));tilearray.add(t);

    }

    }}

    }

    @Overridepublicvoid update(float deltaTime) {

    List touchEvents = game.getInput().getTouchEvents();

    // We have four separate update methods in this example.

  • 7/28/2019 Final Work - Introduction to Android.

    47/81

    Introduktion till Android

    JAWED LALEE 46

    // Depending on the state of the game, we call different updatemethods.

    // update methods.

    if (state == GameState.Ready)updateReady(touchEvents);

    if (state == GameState.Running)updateRunning(touchEvents, deltaTime);

    if (state == GameState.Paused)updatePaused(touchEvents);

    if (state == GameState.GameOver)updateGameOver(touchEvents);

    }

    privatevoid updateReady(List touchEvents) {

    // When the user touches the screen, the game begins.// state now becomes GameState.Running.// Now the updateRunning() method will be called!

    if (touchEvents.size() > 0)state = GameState.Running;

    }

    privatevoid updateRunning(List touchEvents, floatdeltaTime) {

    // All touch input is handled here:int len = touchEvents.size();for (int i = 0; i < len; i++) {

    TouchEvent event = touchEvents.get(i);if (event.type == TouchEvent.TOUCH_DOWN) {

    if (inBounds(event, 0, 285, 65, 65)) {doctor.jump();currentSprite = anim.getImage();doctor.setDucked(false);

    }

    elseif (inBounds(event, 0, 350, 65, 65)) {

    if (doctor.isDucked() == false&& doctor.isJumped() == false&& doctor.isReadyToFire()) {

    doctor.shoot();}

    }

    elseif (inBounds(event, 0, 415, 65, 65)&& doctor.isJumped() == false) {

    currentSprite = Assets.characterDown;doctor.setDucked(true);doctor.setSpeedX(0);

    }

  • 7/28/2019 Final Work - Introduction to Android.

    48/81

    Introduktion till Android

    JAWED LALEE 47

    if (event.x > 400) {// Move right.doctor.moveRight();doctor.setMovingRight(true);

    }

    }

    if (event.type == TouchEvent.TOUCH_UP) {

    if (inBounds(event, 0, 415, 65, 65)) {currentSprite = anim.getImage();doctor.setDucked(false);

    }

    if (inBounds(event, 0, 0, 35, 35)) {pause();

    }

    if (event.x > 400) {// Move right.doctor.stopRight();

    }}

    }

    // 2. Check miscellaneous events like death:

    if (livesLeft == 0) {state = GameState.GameOver;

    }

    // Call individual update() methods here.// This is where all the game updates happen.// For example, doctor.update();doctor.update();if (doctor.isJumped()) {

    currentSprite = Assets.characterJump;} elseif (doctor.isJumped() == false && doctor.isDucked() ==

    false) {currentSprite = anim.getImage();

    }

    ArrayList projectiles = doctor.getProjectiles();for (int i = 0; i < projectiles.size(); i++) {

    Projectile p = (Projectile) projectiles.get(i);if (p.isVisible() == true) {

    p.update();} else {

    projectiles.remove(i);}

    }

  • 7/28/2019 Final Work - Introduction to Android.

    49/81

    Introduktion till Android

    JAWED LALEE 48

    updateTiles();hb.update();hb2.update();bg1.update();bg2.update();animate();

    if (doctor.getCenterY() > 500) {state = GameState.GameOver;

    }}

    privateboolean inBounds(TouchEvent event, int x, int y, int width,int height) {

    if (event.x > x && event.x < x + width - 1 && event.y > y&& event.y < y + height - 1)

    returntrue;else

    returnfalse;

    }

    privatevoid updatePaused(List touchEvents) {int len = touchEvents.size();for (int i = 0; i < len; i++) {

    TouchEvent event = touchEvents.get(i);if (event.type == TouchEvent.TOUCH_UP) {

    if (inBounds(event, 0, 0, 800, 240)) {

    if (!inBounds(event, 0, 0, 35, 35)) {resume();

    }}

    if (inBounds(event, 0, 240, 800, 240)) {nullify();goToMenu();

    }}

    }}

    privatevoid updateGameOver(List touchEvents) {int len = touchEvents.size();for (int i = 0; i < len; i++) {

    TouchEvent event = touchEvents.get(i);if (event.type == TouchEvent.TOUCH_DOWN) {

    if (inBounds(event, 0, 0, 800, 480)) {nullify();System.gc();game.setScreen(new MainMenuScreen(game));return;

    }}

    }

  • 7/28/2019 Final Work - Introduction to Android.

    50/81

    Introduktion till Android

    JAWED LALEE 49

    }

    privatevoid updateTiles() {

    for (int i = 0; i < tilearray.size(); i++) {Tile t = tilearray.get(i);t.update();

    }

    }

    @Overridepublicvoid paint(float deltaTime) {

    Graphics g = game.getGraphics();

    if (Settings.currentLevel == 0) {g.drawImage(Assets.background, bg1.getBgX(), bg1.getBgY());g.drawImage(Assets.background, bg2.getBgX(), bg2.getBgY());

    } elseif (Settings.currentLevel == 1) {g.drawImage(Assets.background2, bg1.getBgX(), bg1.getBgY());

    g.drawImage(Assets.background2, bg2.getBgX(), bg2.getBgY());

    } else {// Default values are always a good idea.g.drawImage(Assets.background, bg1.getBgX(), bg1.getBgY());g.drawImage(Assets.background, bg2.getBgX(), bg2.getBgY());

    }paintTiles(g);

    ArrayList projectiles = doctor.getProjectiles();for (int i = 0; i < projectiles.size(); i++) {

    Projectile p = (Projectile) projectiles.get(i);g.drawRect(p.getX(), p.getY(), 10, 5, Color.YELLOW);

    }// First draw the game elements.

    g.drawImage(currentSprite, doctor.getCenterX() - 61,doctor.getCenterY() - 63);

    g.drawImage(hanim.getImage(), hb.getCenterX() - 48,hb.getCenterY() - 48);

    g.drawImage(hanim.getImage(), hb2.getCenterX() - 48,hb2.getCenterY() - 48);

    // Secondly, draw the UI above the game elements.if (state == GameState.Ready)

    drawReadyUI();if (state == GameState.Running)

    drawRunningUI();if (state == GameState.Paused)

    drawPausedUI();if (state == GameState.GameOver)

    drawGameOverUI();

    }

    privatevoid paintTiles(Graphics g) {

  • 7/28/2019 Final Work - Introduction to Android.

    51/81

    Introduktion till Android

    JAWED LALEE 50

    for (int i = 0; i < tilearray.size(); i++) {Tile t = tilearray.get(i);if (t.type != 0) {

    g.drawImage(t.getTileImage(), t.getTileX(),t.getTileY());

    }}

    }

    publicvoid animate() {anim.update(10);hanim.update(50);

    }

    privatevoid nullify() {

    // Set all variables to null. You will be recreating them in the// constructor.paint = null;bg1 = null;

    bg2 = null;doctor = null;hb = null;hb2 = null;currentSprite = null;character = null;character2 = null;character3 = null;heliboy = null;heliboy2 = null;heliboy3 = null;heliboy4 = null;heliboy5 = null;anim = null;hanim = null;

    // Call garbage collector to clean up memory.System.gc();

    }

    privatevoid drawReadyUI() {Graphics g = game.getGraphics();

    g.drawARGB(155, 0, 0, 0);g.drawString("Tap to Start.", 400, 240, paint);

    }

    privatevoid drawRunningUI() {Graphics g = game.getGraphics();g.drawImage(Assets.button, 0, 285, 0, 0, 65, 65);g.drawImage(Assets.button, 0, 350, 0, 65, 65, 65);g.drawImage(Assets.button, 0, 415, 0, 130, 65, 65);g.drawImage(Assets.button, 0, 0, 0, 195, 35, 35);

  • 7/28/2019 Final Work - Introduction to Android.

    52/81

    Introduktion till Android

    JAWED LALEE 51

    }

    privatevoid drawPausedUI() {Graphics g = game.getGraphics();// Darken the entire screen so you can display the Paused screen.g.drawARGB(155, 0, 0, 0);g.drawString("Resume", 400, 165, paint2);g.drawString("Menu", 400, 360, paint2);

    }

    privatevoid drawGameOverUI() {Graphics g = game.getGraphics();g.drawRect(0, 0, 1281, 801, Color.BLACK);g.drawString("GAME OVER.", 400, 240, paint2);g.drawString("Tap to return.", 400, 290, paint);

    }

    @Override

    publicvoid pause() {if (state == GameState.Running)

    state = GameState.Paused;

    }

    @Overridepublicvoid resume() {

    if (state == GameState.Paused)state = GameState.Running;

    }

    @Overridepublicvoid dispose() {

    }

    @Overridepublicvoid backButton() {

    pause();}

    privatevoid goToMenu() {// TODO Auto-generated method stubgame.setScreen(new MainMenuScreen(game));

    }

    publicstatic Background getBg1() {// TODO Auto-generated method stubreturnbg1;

    }

    publicstatic Background getBg2() {// TODO Auto-generated method stubreturnbg2;

  • 7/28/2019 Final Work - Introduction to Android.

    53/81

    Introduktion till Android

    JAWED LALEE 52

    }

    publicstatic Doctor getRobot() {// TODO Auto-generated method stubreturndoctor;

    }

    }

    LoadingScreenpackage com.gallifrey.doctor;

    import com.gallifrey.Game;import com.gallifrey.Graphics;import com.gallifrey.Screen;import com.gallifrey.Graphics.ImageFormat;

    publicclass LoadingScreen extends Screen {public LoadingScreen(Game game) {

    super(game);}

    @Overridepublicvoid update(float deltaTime) {

    Graphics g = game.getGraphics();Assets.menu = g.newImage("menu.png", ImageFormat.RGB565);Assets.background = g.newImage("background.png",

    ImageFormat.RGB565);Assets.background2 = g.newImage("background2.png",

    ImageFormat.RGB565);

    Assets.character = g.newImage("character.png",

    ImageFormat.ARGB4444);Assets.character2 = g.newImage("character2.png",ImageFormat.ARGB4444);

    Assets.character3 = g.newImage("character3.png",ImageFormat.ARGB4444);

    Assets.characterJump = g.newImage("jumped.png",ImageFormat.ARGB4444);

    Assets.characterDown = g.newImage("down.png",ImageFormat.ARGB4444);

    Assets.heliboy = g.newImage("heliboy.png", ImageFormat.ARGB4444);Assets.heliboy2 = g.newImage("heliboy2.png",

    ImageFormat.ARGB4444);Assets.heliboy3 = g.newImage("heliboy3.png",

    ImageFormat.ARGB4444);Assets.heliboy4 = g.newImage("heliboy4.png",

    ImageFormat.ARGB4444);Assets.heliboy5 = g.newImage("heliboy5.png",

    ImageFormat.ARGB4444);

    Assets.tiledirt = g.newImage("tiledirt.png", ImageFormat.RGB565);Assets.tilegrassTop = g

    .newImage("tilegrasstop.png", ImageFormat.RGB565);

  • 7/28/2019 Final Work - Introduction to Android.

    54/81

    Introduktion till Android

    JAWED LALEE 53

    Assets.tilegrassBot = g.newImage("tilegrassbot.png", ImageFormat.RGB565);

    Assets.tilegrassLeft = g.newImage("tilegrassleft.png",ImageFormat.RGB565);

    Assets.tilegrassRight = g.newImage("tilegrassright.png",ImageFormat.RGB565);

    Assets.button = g.newImage("button.jpg", ImageFormat.RGB565);

    game.setScreen(new MainMenuScreen(game));

    }

    @Overridepublicvoid paint(float deltaTime) {

    Graphics g = game.getGraphics();g.drawImage(Assets.splash, 0, 0);

    }

    @Override

    publicvoid pause() {

    }

    @Overridepublicvoid resume() {

    }

    @Overridepublicvoid dispose() {

    }

    @Overridepublicvoid backButton() {

    }}

    MainMenuScreenpackage com.gallifrey.doctor;

    import java.util.List;import java.util.Random;

    import com.gallifrey.Game;import com.gallifrey.Graphics;import com.gallifrey.Screen;import com.gallifrey.Input.TouchEvent;

    publicclass MainMenuScreen extends Screen {public MainMenuScreen(Game game) {

    super(game);

  • 7/28/2019 Final Work - Introduction to Android.

    55/81

    Introduktion till Android

    JAWED LALEE 54

    }

    @Overridepublicvoid update(float deltaTime) {

    Graphics g = game.getGraphics();List touchEvents = game.getInput().getTouchEvents();

    int len = touchEvents.size();for (int i = 0; i < len; i++) {

    TouchEvent event = touchEvents.get(i);if (event.type == TouchEvent.TOUCH_UP) {

    if (inBounds(event, 50, 350, 250, 450)) {Random r = new Random();if (r.nextInt(2) == 0) {

    System.out.println("THIS");Settings.currentLevel = 0;Settings.save(game.getFileIO());

    } else {System.out.println("THAT");

    Settings.currentLevel = 1;Settings.save(game.getFileIO());

    }

    game.setScreen(new GameScreen(game));}

    }}

    }

    privateboolean inBounds(TouchEvent event, int x, int y, int width,int height) {

    if (event.x > x && event.x < x + width - 1 && event.y > y&& event.y < y + height - 1)

    returntrue;else

    returnfalse;}

    @Overridepublicvoid paint(float deltaTime) {

    Graphics g = game.getGraphics();g.drawImage(Assets.menu, 0, 0);

    }

    @Override

    publicvoid pause() {}

    @Overridepublicvoid resume() {

    }

    @Override

  • 7/28/2019 Final Work - Introduction to Android.

    56/81

    Introduktion till Android

    JAWED LALEE 55

    publicvoid dispose() {

    }

    @Overridepublicvoid backButton() {

    android.os.Process.killProcess(android.os.Process.myPid());

    }}

    Projectilepackage com.gallifrey.doctor;

    import android.graphics.Rect;

    publicclass Projectile {

    privateintx, y, speedX;privatebooleanvisible;

    private Rect r;

    public Projectile(int startX, int startY) {x = startX;y = startY;speedX = 7;visible = true;

    r = new Rect(0, 0, 0, 0);}

    publicvoid update() {

    x += speedX;r.set(x, y, x + 10, y + 5);if (x > 800) {

    visible = false;r = null;

    }if (visible) {

    checkCollision();}

    }

    privatevoid checkCollision() {

    if (Rect.intersects(r, GameScreen.hb.r)) {visible = false;

    if (GameScreen.hb.health > 0) {GameScreen.hb.health -= 1;

    }if (GameScreen.hb.health == 0) {

    GameScreen.hb.setCenterX(-100);

  • 7/28/2019 Final Work - Introduction to Android.

    57/81

    Introduktion till Android

    JAWED LALEE 56

    }

    }if (Rect.intersects(r, GameScreen.hb2.r)) {

    visible = false;

    if (GameScreen.hb2.health > 0) {GameScreen.hb2.health -= 1;

    }if (GameScreen.hb2.health == 0) {

    GameScreen.hb2.setCenterX(-100);

    }

    }}

    publicint getX() {returnx;

    }

    publicint getY() {returny;

    }

    publicint getSpeedX() {returnspeedX;

    }

    publicboolean isVisible() {returnvisible;

    }

    publicvoid setX(int x) {this.x = x;

    }

    publicvoid setY(int y) {this.y = y;

    }

    publicvoid setSpeedX(int speedX) {this.speedX = speedX;

    }

    publicvoid setVisible(boolean visible) {this.visible = visible;

    }

    }

    SampleGamepackage com.gallifrey.doctor;

    import java.io.BufferedReader;import java.io.IOException;

  • 7/28/2019 Final Work - Introduction to Android.

    58/81

    Introduktion till Android

    JAWED LALEE 57

    import java.io.InputStream;import java.io.InputStreamReader;

    import android.app.Activity;import android.content.Context;import android.util.Log;import android.view.WindowManager;

    import com.gallifrey.Screen;import com.gallifrey.game.R;import com.gallifrey.implementation.AndroidGame;

    publicclass SampleGame extends AndroidGame {

    publicstatic String map, map2;booleanfirstTimeCreate = true;publicstaticintscreenRotation;

    @Overridepublic Screen getInitScreen() {

    if (firstTimeCreate) {Assets.load(this);firstTimeCreate = false;

    }

    InputStream is = getResources().openRawResource(R.raw.map1);InputStream is2 = getResources().openRawResource(R.raw.map2);

    map = convertStreamToString(is);map2 = convertStreamToString(is2);

    returnnew SplashLoadingScreen(this);

    }

    @Overridepublicvoid onBackPressed() {

    getCurrentScreen().backButton();}

    privatestatic String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(newInputStreamReader(is));

    StringBuilder sb = new StringBuilder();

    String line = null;try {

    while ((line = reader.readLine()) != null) {sb.append((line + "\n"));

    }} catch (IOException e) {

    Log.w("LOG", e.getMessage());} finally {

    try {

  • 7/28/2019 Final Work - Introduction to Android.

    59/81

    Introduktion till Android

    JAWED LALEE 58

    is.close();} catch (IOException e) {

    Log.w("LOG", e.getMessage());}

    }return sb.toString();

    }

    @Overridepublicvoid onResume() {

    super.onResume();

    Assets.theme.play();WindowManager windowMgr = (WindowManager) this

    .getSystemService(Context.WINDOW_SERVICE);screenRotation = windowMgr.getDefaultDisplay().getRotation();

    }

    @Override

    publicvoid onPause() {super.onPause();Assets.theme.pause();

    }

    }

    Settingspackage com.gallifrey.doctor;

    import java.io.BufferedReader;import java.io.BufferedWriter;

    import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;

    import com.gallifrey.FileIO;

    publicclass Settings {

    // Default values:publicstaticintcurrentLevel = 0;

    publicstaticvoid save(FileIO files) {BufferedWriter out = null;try {

    // Writes a file called .savedata to the SD Cardout = new BufferedWriter(new OutputStreamWriter(

    files.writeFile(".savesample")));

    out.write(Integer.toString(currentLevel));out.write("\n");

    } catch (IOException e) {

  • 7/28/2019 Final Work - Introduction to Android.

    60/81

    Introduktion till Android

    JAWED LALEE 59

    } finally {try {

    if (out != null)out.close();

    } catch (IOException e) {}

    }}

    publicstaticvoid load(FileIO files) {BufferedReader in = null;try {

    // Reads file called Save Datain = new BufferedReader(new InputStreamReader(

    files.readFile(".savesample")));

    // Loads values from the file and replaces default values.currentLevel = Integer.parseInt(in.readLine());

    } catch (IOException e) {

    // Catches errors. Default values are used.} catch (NumberFormatException e) {

    // Catches errors. Default values are used.} finally {

    try {if (in != null)

    in.close();} catch (IOException e) {}

    }}

    }

    SplashLoadingScreenpackage com.gallifrey.doctor;

    import com.gallifrey.Game;import com.gallifrey.Graphics;import com.gallifrey.Screen;import com.gallifrey.Graphics.ImageFormat;

    publicclass SplashLoadingScreen extends Screen {

    public SplashLoadingScreen(Game game) {super(game);

    }

    @Overridepublicvoid update(float deltaTime) {

    Graphics g = game.getGraphics();Assets.splash = g.newImage("splash.jpg", ImageFormat.RGB565);

  • 7/28/2019 Final Work - Introduction to Android.

    61/81

    Introduktion till Android

    JAWED LALEE 60

    game.setScreen(new LoadingScreen(game));

    }

    @Overridepublicvoid paint(float deltaTime) {

    }

    @Overridepublicvoid pause() {

    }

    @Overridepublicvoid resume() {

    }

    @Override

    publicvoid dispose() {

    }

    @Overridepublicvoid backButton() {

    }}

    Tilepackage com.gallifrey.doctor;

    import android.graphics.Rect;

    import com.gallifrey.Image;

    publicclass Tile {

    privateinttileX, tileY, speedX;publicinttype;public Image tileImage;private Doctor doctor = GameScreen.getRobot();private Background bg = GameScreen.getBg1();private Rect r;

    public Tile(int x, int y, int typeInt) {

    tileX = x * 40;tileY = y * 40;

    type = typeInt;

    r = new Rect();

    if (type == 5) {tileImage = Assets.tiledirt;

  • 7/28/2019 Final Work - Introduction to Android.

    62/81

    Introduktion till Android

    JAWED LALEE 61

    } elseif (type == 8) {tileImage = Assets.tilegrassTop;

    } elseif (type == 4) {tileImage = Assets.tilegrassLeft;

    } elseif (type == 6) {tileImage = Assets.tilegrassRight;

    } elseif (type == 2) {tileImage = Assets.tilegrassBot;

    } else {type = 0;

    }

    }

    publicvoid update() {speedX = bg.getSpeedX() * 5;tileX += speedX;r.set(tileX, tileY, tileX + 40, tileY + 40);

    if (Rect.intersects(r, Doctor.yellowRed) && type != 0) {checkVerticalCollision(Doctor.rect, Doctor.rect2);checkSideCollision(Doctor.rect3, Doctor.rect4,

    Doctor.footleft,Doctor.footright);

    }

    }

    publicint getTileX() {returntileX;

    }

    publicvoid setTileX(int tileX) {this.tileX = tileX;

    }

    publicint getTileY() {returntileY;

    }

    publicvoid setTileY(int tileY) {this.tileY = tileY;

    }

    public Image getTileImage() {

    returntileImage;}

    publicvoid setTileImage(Image tileImage) {this.tileImage = tileImage;

    }

    publicvoid checkVerticalCollision(Rect rtop, Rect rbot) {if (Rect.intersects(rtop, r)) {

  • 7/28/2019 Final Work - Introduction to Android.

    63/81

    Introduktion till Android

    JAWED LALEE 62

    }

    if (Rect.intersects(rbot, r) && type == 8) {doctor.setJumped(false);doctor.setSpeedY(0);doctor.setCenterY(tileY - 63);

    }}

    publicvoid checkSideCollision(Rect rleft, Rect rright, Rect leftfoot,Rect rightfoot) {

    if (type != 5 && type != 2 && type != 0) {if (Rect.intersects(rleft, r)) {

    doctor.setCenterX(tileX + 102);

    doctor.setSpeedX(0);

    } elseif (Rect.intersects(leftfoot, r)) {

    doctor.setCenterX(tileX + 85);doctor.setSpeedX(0);

    }

    if (Rect.intersects(rright, r)) {doctor.setCenterX(tileX - 62);

    doctor.setSpeedX(0);}

    elseif (Rect.intersects(rightfoot, r)) {doctor.setCenterX(tileX - 45);doctor.setSpeedX(0);

    }}

    }

    }

    5.4.3 com.gallifrey.implementationAccelerometerHandlerpackage com.gallifrey.implementation;

    import com.gallifrey.doctor.SampleGame;

    import androi