Implementering af et framework til 2D-spil Implementation of a framework for 2D-games

Størrelse: px
Starte visningen fra side:

Download "Implementering af et framework til 2D-spil Implementation of a framework for 2D-games"

Transkript

1 Implementering af et framework til 2D-spil Implementation of a framework for 2D-games Bachelor projekt i Datalogi Christoffer Langhoff Vejleder: Keld Helsgaun Datalogi Roskilde Universitetscenter

2 Resume Formålet med dette projekt er at udvikle og dokumenterer et framework til 2D spil. Frameworket er baseret på et allerede eksisterende framework Greenfoot. For at teste frameworket blev spillet Lunar Lander, oprindeligt skrevet i Greenfoot, implementeret. Da spillet på forhånd var blevet implementeret i Greenfoot, fungerede det som en test af framework der blev programmeret til rapporten. Målet med dette projekt var, at lave et miniframework, baseret på Greenfoot der implementer grafik, lyd og styring med keyboard. For at lave et miniframework blev klasserne i gjort mere simple i forhold til de oprindelige klasser i Greenfoot. I frameworket blev grafik og styring med tastatur implementeret succesfuldt. Dette gav mulighed for at implementere hoveddelen af spillet. Der blev ikke implementerer lyd og mulighed for at tegne tekst. Der var også problemer med implementeringen af collision detection, derfor blev alle de ønskede kravspecifikationer ikke implementeret. Overordnet set blev størstedelen af kravene til programmet implementeret. Abstract The purpose of this project is to develop and document a framework for 2D games. The framework is made from the already existing framework Greenfoot. To test the framework the game Lunar Lander, which had already been implemented in Green, implemented in the framework. As the game already had been implemented in Greenfoot, it worked as a test for the framework, programmed for the report. The goal was to make a miniframework, based on Greenfoot that had to implement graphic, sound and enabling control with a keyboard. To make a miniframework the classes in the miniframework was made more simple, compared to the classes already implemented in Greenfoot. The implementation of the framework graphic and enabling control with a keyboard was, implemented with success. The parts that did not succeed in the framework were sound and the option to draw text. The implementation of collision did not succeed either. Therefore all the requirements for the framework wasn t implemented. But most of the requirements was implemented. 1

3 2

4 Forord Denne rapport er skrevet, for at dokumentere og vejlede til udvikling af et framework til af 2D-spil, udviklet til rapporten. Dette framework blev baseret på det allerede eksisterende framework Greenfoot. Koden til spillet Lunar Lander er blevet implementeret og testet i Greenfoot på forhånd. For at holde produktet så tæt på Greenfoot frameworket er der brugt samme klassenavne. Rapporten og mit produkt udgør mit 1. moduls bachelorprojekt for datalogi, på RUC. I denne rapport vil Actor og World igennem rapporten blive omtalt som aktør og verden og Subclasses af disse vil blive omtalt som underklasser. Der er i dette projekt anvendt programmeringssproget Java. Programmet og en API der giver oversigt over programmet kan findes på Cden med programmet placeret i appendiks D. Koden til frameworket og Spillet Lunar Lander er at finde i appendiks A og B. 3

5 Indholdsfortegnelse Resume...1 Abstract...1 Forord...3 Indholdsfortegnelse...4 Indledning...5 Projektbeskrivelse...5 Kravspecifikation...6 Målgruppe...6 Disposition...7 Framework...8 Brugervejledning...8 Programdokumentation...13 Oversigt over frameworkets klasser...13 Greenfoot...15 GreenfootImage...17 GreenfootSound...18 World...18 Actor...20 Test...22 Separate tests...22 Integrerede tests...23 Diskussion...24 Konklusion...25 Perspektivering...26 Litteraturliste...27 Appendiks...28 A: Uml-diagrammer...28 B: Kode: GameFramework Kildekode C: Kode: Lunar Lander...49 D: CD med program

6 Indledning Spilindustrien udgør i dag en økonomisk voksende industri, der gennem årene er blevet mere økonomisk sikker og accepteret. I artiklen Essential Facts About The Computer and Video Game Industry fra 2011 er det dokumenteret, at der I 72 % af alle Amerikanske hjem bliver spillet computerspil. Med en så stor efterspørgsel på computerspil er der behov for effektive måder at producere spil. I dette projekt vil der være fokus på frameworks (Entertainment software association, 2011). Et framework er en samling af generiske klasser, der indeholder metoder der kan genbruges. Den type framework der i dette projekt er taget udgangspunkt i, er baseret på template metoden. Template metoden, er defineret som en samling af klasser der indeholder metoder der kan genbrugbruges. Kravene til et framework, fremsat af Grady Booch i 1994, er at programmet skal være nemt at overskue, opfylde relevante behov for brugeren, give mulighed for udvidelse, have indbygget sikkerhed ved forkert brug, være effektivt og kunne tilpasse sig forskellige platforme (Booch, 1994). Grunden til at frameworks er relevante, er fordi de giver en mere brugervenlig tilgang til produktion af spil ved for eksempel at anvende genbrugbar kode. Det framework, der er produktet af dette projektarbejde, er baseret det på Greenfoot. Greenfoot er et udviklingsmiljø, henvendt til skoleelever omkring læring af objektorienteret kodning i Java. Det tillader nem udvikling af 2Dgrafik applikationer med mulighed for at skabe simulationer og spil ( 2010). Ved at tage udgangspunkt i et allerede eksisterende framework bliver der, i dette projekt set på den allerede eksisterende programstruktur der er implementeret i Greenfoot, i forhold til hvad det programmerede framework skal kunne. Derfor har målet med dette projekt været få koden til at fungere efter Greenfoots klasse struktur. Måden programmet fungerer på er ved at placere aktører i en verden (en simulation af verden hvor aktører kan handle i). Projektbeskrivelse Dette kapitel indeholder en beskrivelse af projektets kravspecifikationer for frameworkets ønskede funktionalitet. Denne beskrivelse vil dække, hvordan dette projekt opfylder første moduls bindingen for datalogi, på bachelor niveau for datalogi og hvilke krav rapportens framework forventes atl opfylde. Der ledes her videre til problemanalysen og målgruppen for dette projekt. Der er for bachelor niveau i datalogi en semester binding som skal opfyldes, den lyder på følgende: 5

7 Projektets mål er at den studerende opnår evne til at beskrive og reflektereover et selvstændigt udført arbejde, hvor en middelstor programmeringsopgave er planlagt, implementeret, afprøvet og dokumenteret, og hvortil der er anvendt et højere, generelt programmeringssprog. (Rosendahl, 27. august. 2008). Dette projekt opfylder denne binding, gennem praktisk arbejde med udvikling af frameworket og implementeringen af spillet Lunar Lander ved brug af programmeringssproget Java. Efterfølgende vil der bliver skrevet en dokumentation og test af frameworket. Spillet Lunar Lander fungerer som en test af frameworket, idet målet er at implementere den funktionalitet spillet kræver. Den praktiske del af dette projekt består i, først at skrive koden til selve frameworket. Spillet Lunar Lander fungerer her som en test af frameworket, da der under implementeringen af spillet, vil blive fremprovokeret fejl i frameworket, der vil føre til en løbende debuging af frameworkets kode. Koden til Lunar Lander er i forvejen blevet skrevet til Greenfoot og er derfor ikke skrevet fra bunden. Kravspecifikation I dette kapitel vil læseren få et overblik over de kravspecifikationer der er opstillet for udviklingen af frameworket. Kravene til frameworket er følgende: Udvikling af et framework til 2D-spil baseret på Greenfoot. Målet er at implementere lyd, grafik og styring med tastatur. Begrebet grafik dækker her over muligheden for at tegne billeder og tekst i frame. Spillet Lunar Lander, skal kunne køres fra det udviklede framework. Frameworket skal have en høj brugervenlighed. Målet er at brugeren ikke skal have en ekspertviden om Java for at anvende frameworket. Der skal ikke implementeres en grafisk brugeroverflade. Det skal være muligt for brugere af frameworket, at vedligeholde programmet. Målgruppe Dette projekt henvender sig til læsere med interesse i spil udvikling. Målgruppen skal have en forståelse af programmeringssproget Java, svarende til kurset Introduction To Programming der udbydes på RUC. 6

8 En anden målgruppe, er folk med interesse for vedligeholdelse af frameworket. Denne del af målgruppen vil kræve en større forståelse for Java fra brugeren udover den første målgruppe. Der vil til dette formål blive skrevet et afsnit programdokumentation, hvor de mere tekniske aspekter af frameworkets implementation dokumenteres. Spileksemplet er inddraget i rapporten, for at vise eventuelle brugere af programmet, hvordan det anvendes praktisk igennem brugervejledningen. Disposition Rapportens hovedafsnit er Framework. I dette afsnit vil der være en brugervejledning der tjener det formål at give læseren guide til, hvordan frameworket anvendes praktisk til at implementation af spil. Der vil i dette afsnit også være en programdokumentation, hvor frameworkets praktiske implementation og relevante metoder, bliver dokumenteret uddybende. Disse afsnit vil lede til diskussion, der vil indeholde en diskussion med fokus på de kravspecifikationer der er opstillet i indledningen og om de er opfyldt. 7

9 Framework Dette afsnit er opdelt i to underafsnit, en brugevejledning og en programdokumentation. Brugervejledningen er en guide til implementerer af spil i frameworket, en vejledning til brugere af frameworket. Programdokumentationen indebær en mere dybdegående gennemgang de tekniske detaljer af frameworkets implementering. Frameworket kan findes i bilag B, C og D der placeret bagerst i rapporten. Bilag D er den Cd hvor programmet og dets API er placeret på. Brugervejledning For at give et overblik over, hvordan frameworket benyttes af en bruger, vil dette afsnit bestå af en gennemgang af hvordan et spil implementeres. Spillet Lunar Lander er valgt som eksempel for denne gennemgang. De klasser der nødvendige for at implementere Lunar Lander er: World. Actor. Greenfoot. Luner Lander Figur 1. Billede fra Lunar Landers endelige implementering. 8

10 Målet med spillet Lunar Lander er, at lande et rumskib på en platform. Hvis der trykkes på ned pilen accelerere Lander positivt op af y-aksen, ellers vil det ved implementering af tyngdekraft falde med en hvis hastighed negativt ned af y-aksen. Når platformen rammes vil spillet være vundet, hvis der landes med en bestemt hastighed, ellers vil rumskibet eksploderer. Den grafiske repræsentation af Lunar Lander er vist på figur 1. Public class Lander extends Actor public class Moon extends World Tabel 1: Eksempel på måden, hvorved en klasse kan extendes af Actor og World og dermed danne underklasser. Indledende oversigt For at implementere Lunar Lander, skal brugeren oprette en verden der nedarver fra klassen World og aktører der nedarver fra klassen Actor. World og Actor er abstrakte superklasser der indeholder generiske metoder. En superklasse er defineret, som en klasse hvoraf der kan skabes underklasser. Underklasser nedarver metoder fra den superklasse de konstrueret i forlængelse af (Liang, 2010). Ved at anvende superklasser, kan brugeren af et program anvende metoder der allerede er blevet skrevet i disse klasser. I frameworket arbejdes der efter template metoden. Template metoden indfatter at, klasserne World og Actor fungerer som skabeloner og kan genbruges (Booch, 1994). Før de enkelte klassers anvendelse i implementeringsfasen forklares, vil der først blive gennemgået en oversigt over hvordan brugeren, i overordnede træk skal anvende frameworket til at implementere Lunar Lander: 1. Brugeren opretter verdenen Moon. 2. Aktørerne Lander, Flag, Counter og Explosion oprettes. 3. En ny instans af Moon, tilføjes til Greenfoot klassens main metode. 4. I de forskellige aktørers act metode, tilføjes de ønskede handlinger i act metoden som skal udføres. 5. Programmet compiles og startes. Greenfoot. I Lunar Lander indgår verdenen Moon som aktørerne Lander, Flag, Counter og Explosion placeres i. Før end programmet kan køres skal verdenen Moon tilføjes til Greenfoot klassen. En ny instans af Moon tilføjes til, main metoden i Greenfoot som vist på tabel 2. 9

11 Public static void main(string[] args) { new Moon(); Tabel 2. Main metoden i Greenfoot klassen hvor, en verden oprettes. For at det er muligt, for de forskellige aktører at udføre deres handlinger i Moon, er der i World klassen oprettet en ArrayListe, hvor aktører tilføjes. Denne liste kører den enkelte aktør metode igennem med en forløkke, så alle aktøres act metoder udføres hver gang verdenen opdateres. Forløkken er placeret i Greenfoots run metode vist i tabel public void run() { while (true) { while (state == GameState.PLAYING) { try { Thread.sleep(50); for (Actor a : world.actors) { a.act(); world.repaint(); catch (InterruptedException e) { Tabel 3. Greenfoots run metode. while (state == GameState.PAUSED) { try { wait(); catch (InterruptedException e) { Klasserne World og Actor vil blive gennemgået I forhold til hvordan de bruges, i hendhol til spilimplementering i dette afsnit. I programdokumentation vil disse klasser blive gennemgået i mere tekniske detaljer. World Før brugeren opretter aktører, skal der oprettes en verden disse kan placeres i. Størrelsen på verdenen sættes, ved brug af et superkald (super(600, 600, 1)) der referer til Worlds konstruktør. Ved at anvende et superkald, definerer disse værdier bredden, højden og cellestørrelsen på den verden der oprettes, størrelsen på vinduet verdenen skal vises i. Ved at kalde metoden addobject, tilføjes aktørerne Lander, FuelGauge og SpeedOmeter til Moon. Baggrundsbilledet for World sættes, i konstruktøren for superklassen World. Når de forskellige aktører er tilføjet, skal klasserne for den enkelte aktør skrives. 10

12 public class Moon extends World { public Moon() { super(600,600,1); lander = new Lander(); addobject(lander, 326, 100); addobject(new FuelGuage(lander), 135, 40); addobject(new Speedometer(lander), 135, 80); //Force the explosion to initialise the images //We do this in a thread to make it load in the background new Thread() { public void run() { Explosion.initialiseImages();.start(); Tabel 4. Konstruktør for verdenen Moon, der anvendes i spillet Lunar Lander. Actor I denne klasse oprettes de aktører, som brugeren vil placere i verdenen Moon. I dette tilfælde er det aktøren Lander der bruges som eksempel på implementering af en aktør. I konstruktøren, tilknyttes et billede til aktøren og en position, for hvor i verdenens x og y koordinat Lander skal placeres. En vigtig metode i Actor er act(). Metoden er i actor fra starten tom. Formålet med denne metode, er, at brugeren her tilføjer de handlinger der ønskes at en aktør skal udføre. Denne fremgangsmåde giver brugeren rig mulighed for at skabe en store variation af spil, da der kan oprettes nye metoder i Actor efter behov. Der er her kun vist koden for Lander her. Koden for de resterende aktører kan findes i Appendiks B. public class Lander extends Actor { public Lander() { setimage(rocket); setimage("rocket.png"); rocket = getimage(); rocketwiththrust = new GreenfootImage("thrust.png"); rocketwiththrust.drawimage(rocket, 0, 0); public void act() { processkeys(); applygravity(); altitude += speed / speedfactor; setlocation(getx(), (int) (altitude)); checkcollision(); Tabel 5. En oversigt over implementeringen af Lander s konstuktør og act() metode. 11

13 Som bruger behøves ikke mere kode end koden illustreret i forskellige tabeller for dette afsnit principielt. Bag facaden er mekanikken bag framworket implementeret, som er automatiseret. 12

14 Programdokumentation Indholdet af dette afsnit, er en gennemgang af hvordan frameworket er implementeret. Hovedpunkterne vil være en forklaring af hvordan de enkelte klasser er implementeret og fungerer. Der vil her blive fremhævet bestemte metoder, der kræver en uddybende forklaring for at blive forstået. Formålet er at give læseren et overblik over programmet som helhed. Oversigt over frameworkets klasser Figur 2. En oversigt over de forskellige klasser i frameworket og deres relationer. Frameworket er opbygget af klasserne illustreret figur 2. Formålet frameworket har fra starten været, at have brugervenligheden af programmet som en vigtig prioritet. Selve mekanikken bag frameworket er automatiseret, så når der gives input afhængigt af klassen der anvendes, vil de forskellige klasser automatisk behandle disse. Udover de illustrere klasser, er der to hjælpeklasser; panel og keyhandler. Disse er udeladt fra UML-diagrammet for at give et overskueligt overblik over frameworkets konstruktion og relationer mellem disse. I dette afsnit, vil der være fokus på en mere dybdegående gennemgang omkring hvordan de enkelte klasser fungere individuelt og i forhold til hinanden. Før de enkelte klasser bliver gennemgået i detaljer, vil der først introduceres en overordnet gennemgang af klassernes generelle virkemåde. Greenfoot Denne klasse er ansvarlig for, at den enkelte aktør udfører hver deres handlinger angivet i act metoden. Dette gøres ved brug af en run metode, se tabel 3. I denne klasse oprettes en ny instans, af den verden der ønskes anvendt. Greenfoot benytter hjælpeklassen keyhandler, til håndtering af tastaturinput. 13

15 GreenfootImage Denne klasse håndterer billeder og at de tegnes korrekt. Her muliggøres det, for brugeren at sætte og indlæse billeder, så de vises for den aktør eller verden de er relateret til. Udover dette håndter denne klasse tegning af tekst. GreenfootSound GreenfootSound er ansvarlig for, at der kan afspilles og indlæses lydfiler. World World klassen, er en abstrakt klasse, der benyttes ved at skabe underklasser. World klassen indeholder generelle metoder der i underklasserne kan benyttes kun ved at foretage et metodekald til disse. I World oprettes det frame, hvor verdenen og aktørerne tegnes på. World har en hjælpeklasse Panel, der indeholder metoden paint, der henter baggrundsbilledet for verdenen og aktørers billeder og tegner disse. Actor Actor klassen er ligesom World en abstrakt klasse. Brugeren skaber underklasser af Actor og de generelle metoder der er implementeret i superklassen Actor, kan herefter anvendess. 14

16 Greenfoot public class Greenfoot extends JFrame implements Runnable { public Greenfoot(World world, int framesizex, int framesizey) { public Greenfoot() { public static void main(string[] args) { public static void setworld(world w) { public static void stop() { public static boolean iskeydown(string keyname) { public static boolean iskeyreleased(string key) { public static enum GameState { public void pause() { public static void start() public void run() { public static void playsound(string string) { Tabel 6. Skeletklasse over Greenfoot. Denne klasse styrer simulationen af grafik og lader brugeren anvende tastaturstyring og lyd. For at styre simulation af verdenen og de aktører der anvender den, er der i denne klasse implementeret runnable. Runnable er et interface der implementeres ved brug af threads. Runnable implementer en run-metode, der startes ved, at der i World tilføres en instans af Greenfoot til en thread, der stater run metoden. Der er i World klassen en ArrayList hvori der tilføjes aktører. I run-metoden køres ArrayListen actors igennem, hvorefter deres act metode kaldes. Worlds metode repaint kaldes og ved at kalde panel tegnes verdenen hver gang løkken køres. Panel er en hjælpeklasse, der repræsenterer det panel, en verden tegnes på. For at det er muligt at starte programmet anvendes metoden start. Der er i frameworket forskellige gamestates som er PLAYING, PAUSED og GAMEOVER. Da der ikke implementeret muligheden for at pause spillet, sættes gamestate til PLAYING og run startes. Start metoden kaldes i Greenfoots konstruktør. Tastaturstyring er implementeret i metoden iskeydown. iskeydown returnerer en boolean, der returnerer en tast hvis denne er angivet korrekt, ellers returneres false. Der gives en String som input, navnet på den tast der ønskes anvendt. iskeydown er implementeret, med det formål at undgå at brugeren selv skal skabe keyevents. Dette udføres rent praktisk, ved at der oprettes en varibel int code, der henter keycoden for varibalen code, ved brug af kommandoen getkeycode(). Metoden er relateret til keyhandler. 15

17 Public static boolean iskeydown(string keyname) { if(lastkey == null) return false; int code = lastkey.getkeycode(); switch (code) { case KeyEvent.VK_Q: return "Q".equalsIgnoreCase(keyName); default: return false; Tabel 7. Metoden iskeydown i Greenfoot. Metoden fungerer ved at der gives en String som input og et KeyEvent retuneres, for en bestemt tast der ønskes anvendt. Der er i den fulde kode, en case for alle knapper på tastaturet, men her er der kun vist et som eksempel. For at hente den String værdi der gives som input, er der i KeyHandler metoderne keypressed og keyreleased. Disse metoder henter lastkey fra Greenfoot og returnerer den tast der hentes ved brug af iskeydowns switch statement. Hvis en tast er sluppet returneres en nul værdi. Public class KeyHandler extends KeyAdapter { int key; public void keypressed(keyevent e) { Greenfoot.lastKey = e; public void keyreleased(keyevent e) { Greenfoot.lastKey = null; Tabel 8. KeyHandler bliver extended af KeyAdapter, som betyder at de to metoder keypressed og keyreleased automatisk implementeres. Ved at hente variablen lastkey fra Greenfoot registreres det hvis en knap trykkes ned, eller slippes. I Panel er tegnemetoden paint, implementeret. Paint(Graphics g) er overskrevet og kaldes derfor fra Greenfoots run() metode. Baggrundsbilledet fra world hentes og tegnes. For hver aktør i listen actors tegnes billedet for en valgt position. Det halve af højden og bredden trækkes fra så billedet tegnes, centreret omkring den valgte location i public void paint(graphics g) { g.clearrect(0, 0, world.getworldwidth(), world.getworldheight()); g.drawimage(world.getbackgroundimage(), 0, 0, null); for (Actor a : world.actors) { g.drawimage(a.getimage().getimage(), a.getx() - a.getimage().getwidth()/2, a.gety() - a.getimage().getheight()/2, null); g.dispose(); Tabel 9. Metoden Paint far Panel, der henter billeder for World og Actor og tegner disse på Worlds vindue. 16

18 GreenfootImage public class GreenfootImage { public GreenfootImage(String string, int size, Color foreground, Color background) { public GreenfootImage(String pathname) { public GreenfootImage(int width, int height) throws IllegalArgumentException { public GreenfootImage(GreenfootImage image) { public void drawimage(greenfootimage image, int x, int y) { void drawimage(graphics2d g, int x, int y, ImageObserver observer) { private Graphics2D getgraphics() { public void setimage(image image) { public Color getcolorat(int x, int y) { private int getrgbat(int x, int y) { public BufferedImage getimage() { public void setcolor(color color) { public int getwidth() { public int getheight() { public void scale(int width, int height) { public void setfont(font f) { public Font getfont() { private void initgraphics(graphics2d graphics) { public void drawstring(string string, int x, int y) { public void clear() { Tabel 10. Skeletklasse der, repræsenterer den overordnede struktur over klassen GreenfootImage. GreenfootImage indeholder metoder til at generere og tegne billeder og tekst. For at det er muligt anvende billeder af typen GreenfootImage, skal disse konverteres til billedetypen bufferedimage. For at et GreenfootImage kan laves om til et bufferedimage, anvendes metoderne drawimage og getgraphics vist på tabel 11. getgraphics skaber et grafikelement ud fra billedet image, af typen bufferedimage. Dette gøres ved at kalde image.creategraphics(). Public void drawimage(greenfootimage image, int x, int y) { Graphics2D g = this.image.creategraphics(); g.setbackground(default_background); g.setcolor(default_foreground); g.setcomposite(alphacomposite.getinstance(alphacomposite.src_over, 1.0f)); g.drawimage(image.image, x, y, null); void drawimage(graphics2d g, int x, int y, ImageObserver observer) { g.drawimage(this.image, x, y, observer); private Graphics2D getgraphics() { Graphics2D graphics = image.creategraphics(); initgraphics(graphics); return graphics; Tabel 11. De forskellige metoder i GreenfootImage der anvendes for at tegne billeder. 17

19 Der er yderligere mulighed for i GreenfootImage, at tegne tekst. For at en tekst kan udskrives, skal der kunne sættes en font, metoderne setfont og getfont anvendes her. Fordi GreenfootImage skal kunne understøtte, flere forskellige typer af grafiske elementer. Derfor er der oprettet en konstruktør specifikt til tekst. Med forskellige konstruktører, tillader det brugeren af programmet at anvende andre former for grafik, end billeder. GreenfootSound public class GreenfootSound { public GreenfootSound(String pathname) throws Exception { public void play() throws InterruptedException { public void loop() throws InterruptedException { Tabel 12. Skeletklasse for klassen GreenfootSound. I klassen GreenfootSound kan der ved at indlæse en lydfil. Når en lydfil er indlæst kan metoderne play og loop enten afspille eller loope et lydklip. Denne klasse tilhører en af de mere simple klasser i frameworket. World public abstract class World { public World(int worldwidth, int worldheight, int cellsize) { public void removeobject(actor actor) { public void initialize(int worldheight, int worldwidth, int cellsize) { public void act() { public void setcellsize(int cellsize) { public void addobject(actor actor, int x, int y) { public Color getcolorat(int x, int y) { public int getworldwidth() { public int getworldheight() { public int getcellsize() { public void repaint() { List<Actor> getintersectingobjects(actor actor, Class cls) { public void setbackgroundimage(string pathname) throws IllegalArgumentException { public BufferedImage getbackgroundimage() { public void started() { public void stopped() { Tabel 13. Skeletklasse for World, der viser alle de tilhørende metoder og deres input. World repræsenterer en verden og det grafiske vindue forskellige aktører skal vises i. I konstruktøren initialiseres en ny instans af hjælpeklassen Panel og et nyt frame oprettes i konstruktøren. Instansen af panel tilføjes til frame. I dette frame, tilføjes de grafiske elementer der 18

20 skal tegnes i form af aktører. For at få gentegnet alle elementer i en verden, oprettes der en ny instans af Greenfoot klassen som tilføjes til en tråd, ved tilføjelse startes run-metoden i Greenfoot. public World(int worldwidth, int worldheight, int cellsize) { initialize(worldwidth, worldheight, cellsize); actors = new ArrayList<Actor>(); keyhandler = new KeyHandler(); Frame frame = new Frame(); panel = new Panel(this); Greenfoot.setWorld(this); frame.setdefaultcloseoperation(jframe.exit_on_close); panel.setpreferredsize(new Dimension(worldWidth, worldheight)); frame.add(panel); frame.pack(); frame.setresizable(false); panel.addkeylistener(keyhandler); panel.requestfocus(); Greenfoot greenfoot = new Greenfoot(); Thread thread = new Thread(greenfoot); thread.start(); setbackgroundimage( moon.png ); frame.setvisible(true); Tabel 14. Konstruktøren for World klassen, hvor der oprettes et nyt Frame, hvor der tilføjes KeyAdapter. Baggrunden for en verden sættes i konstruktøren for World. En vigtig metode i World er addobject(). Denne metode tilføjer en aktør til en verden. Der er i konstruktøren for World oprettet en ArrayList e actors. Ved at implementere denne liste kan der tilføjes flere aktører til en verden. Kommandoen actors.add(actor) tilføjer en Actor til listen actors. Aktørens lokation sættes ved brug af metoden setlocation, hvor et x og y koordinat sættes. Metoden addedttoworld der er placeret i Actor, er fra start tom og overskrives. Ved at tilføre denne klasse i de udvidede klasser at sætte den verden, en aktør tilhører. public void addobject(actor actor, int x, int y) { actors.add(actor); actor.setworld(this); actor.setlocation(x, y); actor.addedtoworld(this); Tabel 15. Metoden addobject og måden den er struktureret på. En anden vigtig funktion i klassen er, Listen getintersectingobjects. Her returneres en aktør hvis den intersecter en anden aktør. For hver aktør oprettes et rectangle, hvorefter der kan tjekkes om de overlapper hinanden, baseret på et billedets højde og brede. 19

21 Baggrunden for en verden sættes med metoden setbackgroundimage(string pathname). Et navn på en billedfil angives som String input og filen læses. Efterfølgende hentes baggrundsbilledet, med metoden getbackgroundimage(). Actor En Actor repræsenterer et handlende individ i en verden. Som start har Actor en tom konstruktør og en tom act() metode. public abstract class Actor { public Actor() { public void act() { protected void addedtoworld(world world) { public int getx() { public int gety() { public void setlocation(int x, int y) { public void setworld(world world) { boolean intersects(actor other) { protected List getintersectingobjects(class ls) { public void setimage(string pathname) throws IllegalArgumentException { public void setimage(greenfootimage image) { public GreenfootImage getimage() { public World getworld() { Tabel 16. Skeletoversigt og de forskellige metoder I klassen Actor. Hvis der er flere aktører i en verden, er der implementeret en boolean intersects. Hver aktørs x, y koordinat, brede og højde hentes. boolean intersects(actor other) { Rectangle rect1 = new Rectangle(x, y, image.getwidth(), image.getheight()); Rectangle rect2 = new Rectangle(x, y, image.getwidth(), image.getheight()); return rect1.intersects(rect2); protected List getintersectingobjects(class cls) { List l = world.getintersectingobjects(this, cls); l.remove(this); return l; Tabel 17. Metoden intersects() der tjekker om en Actor kolliderer med en anden. For at dette kan lade sig gøre, er der skrevet en list, der henter de aktører der kolliderer. Disse hentes fra Worlds liste, getintersectingobjects. Med metoden addedtoworld, sættes den verden, en aktør skal tilhøre. Dette tillader en aktør at anvende metoder og kommunikere med den verden denne er relateret til. To vigtige metoder i Actor er setworld og setlocation. Disse metoder er med til at en aktør kan tilknyttes til en bestemt verden og at lokationen for en aktør for, hvor i en verden s x- og y-koordinat denne skal placeres. Disse metoder a nvendes i World i metoden addobject. 20

22 public void addedtoworld(world world) { moon = (Moon) world; altitude = gety(); Tabel 18. addedtoworld er overskrevet, og implementeres i underklasserne på følgende måde. Den verden en aktør tilhører angives. 21

23 Test I dette afsnit vil der bliver uddybet hvordan frameworket er blevet testet og hvilke testtyper der er anvendt. Test af frameworket har hovedsageligt foregået ved implementering af spillet Lunar Lander som har fungeret som debuging af frameworkets kode. Der overordnet to slags kodetests White-box og Black-box. White-box er baseret på programmets tekst og er en sikring af, om et program gør det det skal, baseret selve programmets tekst. Ved Black-box er det et en test for om programmet gør det, som man påstår og om input og output hænger sammen. White-box testing blev i dette hovedsageligt anvendt i starten. Ved at se på programmets tekst blev det testet for om indholdet af koden gav det ønskede resultat. Det er mest relevant at anvende White-box test i starten af kodeprocessen for et program, da man her skal konstruere selve programmets virkemåde og dets struktur. Black-Box testing blev hovedsagelige anvendt senere hen i kodningsprocessen. Denne testform blev anvendt ved at give det ønskede input til programmet også tjekke om det rigtige output blev returneret (Rosendahl, 2008). Separate tests Afprøvningen af frameworket har hovedsageligt fundet sted gennem en præcis implementering af Lunar Lander. Behovet for test af frameworket lå i test af enkelte dele af programmet. Før end det var muligt at teste Lunar Lander, skulle koden til frameworket skrives. Koden til Lunar Lander blev ikke ændret fra spillets oprindelige kode fra Greenfoot og blev implementeret uden ændringer og tilpasning til det skrevne framework. Efterhånden som de enkelte dele af frameworket blev implementeret, kunne disse testes løbende efter en objektorienteret tilgang. De enkelte problemer der opstod, blev løst løbende i processen individuelt gennem debuging. En måde at teste for fejl på der sikrer, at der ikke bliver givet forkert input, er at kaste exceptions. F. eks hvis en billede-fil indlæses fra en forkert sti, vil programmet give besked til brugeren ved at kaste en exception. Med denne slags fejltests bliver brugeren hvis dele af programmet håndteres forkert, i forhold til den måde programmet skal anvendes på (Rosendahl, 2008). 22

24 Integrerede tests Et problem der ikke blev løst, var collision detection i spillet Lunar Lander. I Lunar Lander, fungerer collision detection ved, at der hentes farvepixels ud fra baggrunden. Det lykkedes ikke at få metoderne der henter farvepixels til at virke. Disse metoder kan, af senere brugere af frameworket rette op på denne fejl gennem vedligeholdelse og få alle dele af spillet til at virke. En anden metode der blev brugt meget i starten, var brug af testudskrifter. Ved at anvende testudskrifter kan man tjekke om, man får det ønskede output fra sit program (Rosendahl, 2008). 23

25 Diskussion I dette afsnit vil der være end diskussion af resultatet af programmet, i forhold til de kravspecifikationer der blev opstillet i indledningen. I kravspecifikationen var kravet at, der skulle implementeres lyd, grafik og styring med tastatur. Et andet mål var, at få spillet Lunar Lander til at virke med alle de funktioner der var implementeret i spillet oprindeligt. Det lykkedes at få implementeret frameworket, således at brugervenlighed der findes i Greenfoot blev forholdt intakt. De eneste klasser brugeren skal anvende for at lave et spil, er Greenfoot hvor der skal oprettes ny instans, af den verden der skal placeres aktører i og der skal laves et ønsket antal underklasser af World og Actor. Et andet krav var, at frameworket skulle anvende den oprindelige kode fra spillet Lunar Lander, da dette spil benyttede de fleste muligheder for funktionalitet implementeret i Greenfoot. Det er i frameworket, med den endelige kode muligt at lave en verden hvori der kan tilknyttes aktører. I Lunar Lander lykkedes det ved brug af frameworket, skrevet til rapporten at få tilknyttet billeder og tegnet disse så en verden og en aktør hvert er tilknyttet et billede. Muligheden for at styre aktøren Lander ved brug af tastaturstyring blev implementeret succesfuldt. Derfor er der i spillet implementeret tyngdekraft, så Landerens y position aftager og hvis der trykkes på nedtasten accelerer Lander positivt opad y-aksen. De elementer det ikke lykkedes at implementere, var tegning af tekst. I det fuldt funktionelle udgave af Lunar Lander er der, en tekstudskrift i venstre hjørne, der viser mængden af brændstof der er tilbage og hastighed for Lander. Denne funktionalitet krævede i GreenfootImage, at der blev mulighed for at tegne Strings ud. Denne funktionalitet blev ikke implementeret så denne fungerede. I det oprindelige spil blev der anvendt collision detection, hvor programmet tjekker farven på baggrunden. Hvis denne er sort (Baggrundsfarven) vil spillet fortsætte men hvis denne er hvid så slutter spillet og Lander lander eller eksploderer. Grundet kompleksiteten af denne funktionalitet, og tiden til dette projekt lykkedes det ikke at implementere dette succesfuldt. Det lykkedes heller ikke at teste lyd, da dette krævede at collision detection virkede. Overordner set lykkedes det at implementere størstedelen af de ønskede krav fra kravspecifikationen. De mest essentielle af kravene blev implementeret for frameworket. 24

26 Konklusion Baseret på diskussionen og kravspecifikationen, kan det konkluderes at det lykkedes at implementere frameworket, så det blev muligt at starte og spille spillet. I Lunar Lander blev grafik og styring med tastatur implementeret med succes, så det blev muligt spille spillet med de mest essentielle funktioner. Det lykkede ikke at få implementeret collision detection og tekstudskrivning da disse var af mere kompleks funktionalitet. Frameworket er implementeret sådan, at det er muligt for brugere at vedligeholde frameworket. 25

27 Perspektivering Det lykkedes i frameworket, at implementerer de mest centrale funktioner. Det lykkedes en pæn del af vejen at få de mest centrale funktioner i frameworket til at fungere. Idet at det ikke lykkedes at implementerer alle de ønskede funktioner blev alle kravspecifikationens ikke opfyldt helt. De perspektiver der vil blive perspektiveret på ud fra det endelige produkt er: - Videreudvikling af frameworket. - Yderligere test af framework med andre spil end Lunar Lander. Videreudvikling af frameworket Ikke alle kravene fra kravspecifikationen blev implementeret. Alle de ønskede klasser blev implementeret og dette giver mulighed for, at brugere af frameworket at vedligeholde programmet. Ved en vedligeholdelse af frameworket kan dets funktionalitet udvides så, der tilføres mere funktionalitet. Da strukturen for selve frameworket er skrevet vil der udfra, det udførte kode arbejde i rapporten være grundlag for at bygge videre på programmet. Yderligere test af framework med andre spil end Lunar Lander Frameworket blev i denne rapport blevet testet med Lunar Lander. For at teste frameworkets funktionalitet yderligere, kan implementering af andre spille give et mere varieret billede af programmets funktionalitet. Ved implementering af forskellige spil typer, kan der kræves vedligeholdelse, da forskellige spil kan stille forskellige krav til frameworkets funktionalitet. 26

28 Litteraturliste Booch, Grady, Object-Oriented Analys and Design with applications, Addison-Wesley, Second edition, Entertainment software association, Essentiel Facts About The Computer and video Game Industry, 2011, URL: Liang, Y. Daniel, Intoduction to Java Programming, Pearson, 8 udgave, 2010, ISBN: Rosendahl, Mads, Råd og Regler for projektarbejde på datalogis Bachelormodul, 27. august The New York Times Bits, Video Game Industry Continues Major Growth, Gartner Says, 2011 URL: Lunar Lander with Guages, , Url: About Greenfoot, 2010, Url:

29 Appendiks A: Uml-diagrammer Figur 3. Uml-diagram over relationerne mellem, de forskellige klasser i Lunar Lander. 28

30 Figur 4. UML-diagram over frameworket der giver en oversigt over relationer mellem de forskellige klasser. 29

31 B: Kode: GameFramework Kildekode. Greenfoot package GameFramework; import java.awt.event.keyevent; import javax.swing.jframe; import LunarLander.Moon; * Greenfoot class Christoffer Langhoff * public class Greenfoot extends JFrame implements Runnable { public static int framesizex; public static int framesizey; public static GameState state; static World world; static Actor actor; static GreenfootImage image; static GreenfootSound sound; static KeyHandler keyhandler; static KeyEvent lastkey; static Greenfoot controller; public Greenfoot(World world, int framesizex, int framesizey) { this.world = world; this.framesizex = framesizex; this.framesizey = framesizey; public Greenfoot() { start(); public static void main(string[] args) { new Moon(); public static void setworld(world w) { world = w; 30

32 public static void stop() { * Denne benyttes til at anvende sætte en Key på tasturet. keyname public static boolean iskeydown(string keyname) { if(lastkey == null) return false; int code = lastkey.getkeycode(); switch (code) { case KeyEvent.VK_Q: return "Q".equalsIgnoreCase(keyName); case KeyEvent.VK_W: return "W".equalsIgnoreCase(keyName); case KeyEvent.VK_E: return "E".equalsIgnoreCase(keyName); case KeyEvent.VK_R: return "R".equalsIgnoreCase(keyName); case KeyEvent.VK_T: return "T".equalsIgnoreCase(keyName); case KeyEvent.VK_Y: return "Y".equalsIgnoreCase(keyName); case KeyEvent.VK_U: return "U".equalsIgnoreCase(keyName); case KeyEvent.VK_I: return "I".equalsIgnoreCase(keyName); case KeyEvent.VK_O: return "O".equalsIgnoreCase(keyName); case KeyEvent.VK_P: return "P".equalsIgnoreCase(keyName); case KeyEvent.VK_A: return "A".equalsIgnoreCase(keyName); case KeyEvent.VK_S: return "S".equalsIgnoreCase(keyName); case KeyEvent.VK_D: return "D".equalsIgnoreCase(keyName); case KeyEvent.VK_F: return "F".equalsIgnoreCase(keyName); case KeyEvent.VK_G: return "G".equalsIgnoreCase(keyName); case KeyEvent.VK_H: return "H".equalsIgnoreCase(keyName); case KeyEvent.VK_J: return "J".equalsIgnoreCase(keyName); case KeyEvent.VK_K: return "K".equalsIgnoreCase(keyName); case KeyEvent.VK_L: return "L".equalsIgnoreCase(keyName); case KeyEvent.VK_Z: return "Z".equalsIgnoreCase(keyName); case KeyEvent.VK_X: return "X".equalsIgnoreCase(keyName); case KeyEvent.VK_C: return "C".equalsIgnoreCase(keyName); case KeyEvent.VK_V: return "V".equalsIgnoreCase(keyName); case KeyEvent.VK_B: return "B".equalsIgnoreCase(keyName); case KeyEvent.VK_N: return "N".equalsIgnoreCase(keyName); case KeyEvent.VK_M: return "M".equalsIgnoreCase(keyName); case KeyEvent.VK_UP: return "UP".equalsIgnoreCase(keyName); case KeyEvent.VK_DOWN: return "DOWN".equalsIgnoreCase(keyName); case KeyEvent.VK_LEFT: return "LEFT".equalsIgnoreCase(keyName); case KeyEvent.VK_RIGHT: return "RIGHT".equalsIgnoreCase(keyName); case KeyEvent.VK_ESCAPE: return "ESCAPE".equalsIgnoreCase(keyName); case KeyEvent.VK_SPACE: return "SPACE".equalsIgnoreCase(keyName); 31

33 case KeyEvent.VK_CONTROL: return "CONTROL".equalsIgnoreCase(keyName); case KeyEvent.VK_ALT: return "ALT".equalsIgnoreCase(keyName); case KeyEvent.VK_ENTER: return "ENTER".equalsIgnoreCase(keyName); default: return false; * Metoder der returnerer null hvis en tastaturknap slippes. key public static boolean iskeyreleased(string key) { return lastkey!= null; public static enum GameState { PLAYING, PAUSED, GAMEOVER; // Wait with pause not part of greenfoot. public void pause() { state = GameState.PAUSED; * Starter run metoden og sætter gamestate til Playinh. public static void start() { state = GameState.PLAYING; 32

34 @Override public void run() { while (true) { while (state == GameState.PLAYING) { try { Thread.sleep(50); for (Actor a : world.actors) { a.act(); world.repaint(); catch (InterruptedException e) { while (state == GameState.PAUSED) { try { wait(); System.out.println("Paused"); catch (InterruptedException e) { public static void playsound(string string) { try { sound.play(); catch (InterruptedException e) { e.printstacktrace(); 33

35 GreenfootImage package GameFramework; import java.awt.alphacomposite; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.graphics2d; import java.awt.image; import java.awt.image.bufferedimage; import java.awt.image.imageobserver; import java.io.file; import java.io.ioexception; import javax.imageio.imageio; import org.w3c.dom.css.rgbcolor; * GreenfootImage * Christoffer Langhoff * public class GreenfootImage { private BufferedImage image; private Font currentfont; private int width, height; private static final Color DEFAULT_BACKGROUND = new Color(255, 255, 255, 0); private static final Color DEFAULT_FOREGROUND = Color.BLACK; private Color currentcolor = DEFAULT_FOREGROUND; * Konstuktør til Strings. * string size foreground background public GreenfootImage(String string, int size, Color foreground, Color background) { Graphics2D g = (Graphics2D) image.getgraphics(); Font font = g.getfont().derivefont((float) size); g.setfont(font); 34

36 * Konstruktør til Images. * pathname public GreenfootImage(String pathname) { try { image = ImageIO.read(new File(pathName)); catch (IOException e) { System.err.println(e); System.exit(0); public GreenfootImage(int width, int height) throws IllegalArgumentException { this.width = width; this.height = height; public GreenfootImage(GreenfootImage image) { Graphics2D g = getgraphics(); g.setcomposite(alphacomposite.src); g.drawimage(image.getimage(), 0, 0, null); g.dispose(); * Der gives et GreenfootImage som input der tegnes. * image x y public void drawimage(greenfootimage image, int x, int y) { Graphics2D g = this.image.creategraphics(); g.setbackground(default_background); g.setcolor(default_foreground); g.setcomposite(alphacomposite.getinstance( AlphaComposite.SRC_OVER, 1.0f)); g.drawimage(image.image, x, y, null); 35

37 void drawimage(graphics2d g, int x, int y, ImageObserver observer) { g.drawimage(this.image, x, y, observer); private Graphics2D getgraphics() { Graphics2D graphics = image.creategraphics(); initgraphics(graphics); return graphics; public void setimage(image image) { this.image = (BufferedImage) image; public Color getcolorat(int x, int y) { return new Color(getRGBAt(x, y), true); private int getrgbat(int x, int y) { return image.getrgb(x, y); public BufferedImage getimage() { return image; public void setcolor(color color) { currentcolor = color; public int getwidth() { return image.getwidth(); public int getheight() { return image.getheight(); * Tager width og height som input med det formål at skalere størrelsen på * et billede. * width height 36

38 public void scale(int width, int height) { if (width == image.getwidth() && height == image.getheight()) return; BufferedImage scaled = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = scaled.creategraphics(); g.setcomposite(alphacomposite.src); g.drawimage(image, 0, 0, width, height, null); g.dispose(); image = scaled; public void setfont(font f) { currentfont = f; public Font getfont() { if (currentfont == null) { currentfont = getgraphics().getfont(); return currentfont; * Initialiserer grafik. graphics private void initgraphics(graphics2d graphics) { if (graphics!= null) { graphics.setbackground(default_background); graphics.setcolor(currentcolor); if (currentfont!= null) { graphics.setfont(currentfont); public void drawstring(string string, int x, int y) { Graphics2D g = getgraphics(); g.drawstring(string, x, y); public void clear() { Graphics2D g = getgraphics(); g.clearrect(0, 0, getwidth(), getheight()); g.dispose(); 37

39 GreenfootSound package GameFramework; import java.applet.applet; import java.applet.audioclip; import java.net.url; import javax.sound.sampled.audioinputstream; import javax.sound.sampled.audiosystem; import javax.sound.sampled.clip; * GreenfootSound Christoffer Langhoff * public class GreenfootSound { AudioClip clip; public GreenfootSound(String pathname) throws Exception { URL url = new URL(pathName); clip = Applet.newAudioClip(url); public void play() throws InterruptedException { clip.play(); public void loop() throws InterruptedException { clip.loop(); 38

40 World package GameFramework; import java.awt.color; import java.awt.dimension; import java.awt.event.keyevent; import java.awt.image.bufferedimage; import java.io.file; import java.io.ioexception; import java.util.arraylist; import java.util.list; import javax.imageio.imageio; import javax.swing.jframe; import javax.swing.jpanel; * World Christoffer Langhoff * public abstract class World { private int width; private int height; private int cellsize; private int x, y; private static final Color DEFAULT_BACKGROUND_COLOR = Color.WHITE; static Actor actor; static KeyHandler keyhandler; KeyEvent lastkey; JPanel panel; private GreenfootImage backgroundimage; private BufferedImage image; public List<Actor> actors; 39

41 public World(int worldwidth, int worldheight, int cellsize) { initialize(worldwidth, worldheight, cellsize); actors = new ArrayList<Actor>(); keyhandler = new KeyHandler(); JFrame frame = new JFrame(); panel = new Panel(this); Greenfoot.setWorld(this); frame.setdefaultcloseoperation(jframe.exit_on_close); panel.setpreferredsize(new Dimension(worldWidth, worldheight)); frame.add(panel); frame.pack(); frame.setresizable(false); panel.addkeylistener(keyhandler); panel.requestfocus(); Greenfoot greenfoot = new Greenfoot(); Thread thread = new Thread(greenfoot); thread.start(); setbackgroundimage("moon.png"); frame.setvisible(true); public void removeobject(actor actor) { actor.setworld(null); * Initialiserer en verden og sætter højde, brede og cellestørrelse. * worldheight worldwidth cellsize public void initialize(int worldheight, int worldwidth, int cellsize) { this.height = height; this.width = width; this.backgroundimage = backgroundimage; this.cellsize = cellsize; * Act metode for verden. public void act() { 40

42 public void setcellsize(int cellsize) { this.cellsize = cellsize; * Tilføjer en Actor til en verden. actor x y public void addobject(actor actor, int x, int y) { actors.add(actor); actor.setworld(this); actor.setlocation(x, y); actor.addedtoworld(this); public Color getcolorat(int x, int y) { int xpixel = (int) Math.floor(getWidth() / 2); int ypixel = (int) Math.floor(getHeight() / 2); System.out.println(x + " " + y); if (xpixel >= backgroundimage.getwidth()) { System.out.println("xpixel"); return DEFAULT_BACKGROUND_COLOR; if (ypixel >= backgroundimage.getheight()) { System.out.println("ypixel"); return DEFAULT_BACKGROUND_COLOR; return backgroundimage.getcolorat(x, y); public int getwidth() { return width; public int getheight() { return height; public int getcellsize() { return cellsize; public void repaint() { panel.repaint(); 41

43 * Liste der returner Actors der intersecter. actor cls List<Actor> getintersectingobjects(actor actor, Class cls) { List<Actor> l = new ArrayList<Actor>(); for (Actor a : actors) { if (a!= actor && (cls == null cls.isinstance(a) && a.intersects(actor))) a.intersects(actor); l.add(a); return l; * Sætter baggrunden for World. pathname IllegalArgumentException public void setbackgroundimage(string pathname) throws IllegalArgumentException { try { image = ImageIO.read(new File(pathName)); catch (IOException e) { System.err.println(e); System.exit(0); * Henter baggrundsbilledet for World. public BufferedImage getbackgroundimage() { return image; public void drawstring() { public void started() { 42

44 public void stopped() { 43

45 Actor package GameFramework; import java.awt.rectangle; import java.util.list; * Actor Christoffer Langhoff * public abstract class Actor { private int x, y; static Actor actor; static World world; static GreenfootImage image; public Actor() { * Der tilføjes i denne metode de act's en Actor skal udføre. public void act() { * Sætter i en klasse, er extended af Actor den World den skal tilføjes til. world protected void addedtoworld(world world) { public int getx() { return x; public int gety() { return y; * Sætter det x- og y-koordinat hvor en Actor placeres. x y 44

46 public void setlocation(int x, int y) { this.y = y; this.x = x; * Sætter den World en Actor tilhører. world public void setworld(world world) { this.world = world; * Tjekker om to actors intesecter hinanden. other boolean intersects(actor other) { Rectangle rect1 = new Rectangle(x, y, image.getwidth(), image.getheight()); Rectangle rect2 = new Rectangle(x, y, image.getwidth(), image.getheight()); return rect1.intersects(rect2); * Liste der henter Actors der intersecter. cls protected List getintersectingobjects(class cls) { List l = world.getintersectingobjects(this, cls); l.remove(this); return l; public void setimage(string pathname) throws IllegalArgumentException { image = new GreenfootImage(pathName); public void setimage(greenfootimage image) { this.image = image; public GreenfootImage getimage() { return image; 45

47 public World getworld() { return world; 46

48 KeyHandler package GameFramework; import java.awt.event.keyadapter; import java.awt.event.keyevent; import java.util.hashmap; import java.util.map; * KeyHandler Christoffer Langhoff * public class KeyHandler extends KeyAdapter { int key; public void keypressed(keyevent e) { Greenfoot.lastKey = e; public void keyreleased(keyevent e) { Greenfoot.lastKey = null; 47

49 Panel package GameFramework; import java.awt.graphics; import javax.swing.jpanel; * Panel Christoffer Langhoff * public class Panel extends JPanel { World world; public Panel(World world) { this.world = world; * Paint metode der tegner billeder for Actor og public void paint(graphics g) { g.clearrect(0, 0, world.getwidth(), world.getheight()); g.drawimage(world.getbackgroundimage(), 0, 0, null); for (Actor a : world.actors) { g.drawimage(a.getimage().getimage(), a.getx() -a.getimage().getwidth()/2, a.gety() - a.getimage().getheight()/2, null); g.dispose(); 48

50 C: Kode: Lunar Lander Counter package LunarLander; import java.awt.font; import java.awt.color; import GameFramework.Actor; import GameFramework.GreenfootImage; * Counter that displays a number. * Michael Kolling public class Counter extends Actor { protected int value = 0; private String text; private int stringlength; protected Color color = java.awt.color.white; public Counter() { this(""); public Counter(String prefix) { value = 0; text = prefix; stringlength = (text.length() + 2) * 16; setimage(new GreenfootImage(stringLength, 24)); GreenfootImage image = getimage(); // font skal sættes før denne kan anvendes. Font font = image.getfont(); image.setfont(font.derivefont(24.0f)); // use larger font updateimage(); public void act() { updatevalue(); updateimage(); 49

51 public int getvalue() { return value; protected void updatevalue() { // override in subclasses * Make the image private void updateimage() { GreenfootImage image = getimage(); image.clear(); image.setcolor(color); image.drawstring(text + value, 1, 18); 50

52 Explosion package LunarLander; import java.io.objectinputstream.getfield; import java.util.*; import GameFramework.Actor; import GameFramework.Greenfoot; import GameFramework.GreenfootImage; * An explosion. It starts by expanding and then collapsing. * The explosion will explode other obejcts that the explosion intersects. * Poul Henriksen public class Explosion extends Actor { How many images should be used in the animation of the explostion private final static int IMAGE_COUNT= 8; * The images in the explosion. This is static so the images are not * recreated for every object (improves performance significantly). private static GreenfootImage[] images; Current size of the explosion private int size=0; How much do we increment the index in the explosion animation. private int increment=1; public Explosion() { initialiseimages(); setimage(images[0]); Greenfoot.playSound("Explosion.wav"); * Create the images for explosion. public synchronized static void initialiseimages() { if(images == null) { GreenfootImage baseimage = new GreenfootImage("explosion.png"); int maxsize = baseimage.getwidth()*4; int delta = maxsize / (IMAGE_COUNT+1); int size = 0; 51

53 images = new GreenfootImage[IMAGE_COUNT]; for(int i=0; i < IMAGE_COUNT; i++) { size = size + delta; images[i] = new GreenfootImage("explosion.png"); images[i].scale(size, size); * EXPLODE! public void act() { setimage(images[size]); size += increment; if(size>=image_count) { increment = -increment; size += increment; explodeothers(); if(size <= 0) { getworld().removeobject(this); * Explodes all intersecting objects. private void explodeothers() { List explodeem = getintersectingobjects(null); Iterator i = explodeem.iterator(); while(i.hasnext()) { Actor a = (Actor) i.next(); if(! (a instanceof Explosion)) { //Don't explode other explosions int x = a.getx(); int y = a.gety(); //Replace other object with an explosion getworld().removeobject(a); getworld().addobject(new Explosion(), x, y); 52

54 Flag package LunarLander; import GameFramework.Actor; * A flag to plant on the moon. * Poul Henriksen public class Flag extends Actor { 53

55 FuelGauge package LunarLander; import java.awt.font; * Fuel Guage that displays a Lander's Fuel Level. * Allen Hammock public class FuelGuage extends Counter { private Lander lander; public FuelGuage() { this(new Lander()); public FuelGuage(Lander l) { super("fuel Level: "); lander = l; color = java.awt.color.green; updatevalue(); protected final void updatevalue() { value = lander.getfuellevel(); if (value < 50) color = java.awt.color.yellow; if (value < 25) color = java.awt.color.red; 54

56 Lander package LunarLander; import java.awt.color; import GameFramework.Actor; import GameFramework.Greenfoot; import GameFramework.GreenfootImage; import GameFramework.World; * A lunar lander * Poul Henriksen public class Lander extends Actor { Current speed private double speed = 0; private int fuel = 100; private double gravity = 1.6; Current speed private double MAX_LANDING_SPEED = 10; Power of the rocket private double thrust = -3; The location private double altitude; The speed is divided by this. private double speedfactor = 10; Rocket image without thrust private GreenfootImage rocket; Rocket image with thrust private GreenfootImage rocketwiththrust; Moon we are trying to land on private Moon moon; Left foot private int leftx = -13; Right foot private int rightx = 15; Bottom of lander 55

57 private int bottom = 27; public Lander() { setimage(rocket); setimage("rocket.png"); rocket = getimage(); rocketwiththrust = new GreenfootImage("thrust.png"); rocketwiththrust.drawimage(rocket, 0, 0); public void act() { processkeys(); applygravity(); altitude += speed / speedfactor; setlocation(getx(), (int) (altitude)); // checkcollision(); * Lander has been added to the world. public void addedtoworld(world world) { moon = (Moon) world; altitude = gety(); * Current fuel level public int getfuellevel() { return fuel; * Current speed public double getvelocity() { return speed; * Handle keyboard input. private void processkeys() { 56

58 if((fuel > 0) && Greenfoot.isKeyDown("down")) { // can't thrust if out of fuel! if (fuel < 1) return; speed+=thrust; setimage(rocketwiththrust); fuel-=1; else { setimage("rocket.png"); * Let the gravity change the speed. private void applygravity() { speed += moon.getgravity(); * Whether we have touched the landing platform yet. private boolean islanding() { System.out.println("isLanding"); Color leftcolor = moon.getcolorat(getx() + leftx, gety() + bottom); System.out.println((getX() + leftx) + (gety() + bottom + " I lander")); Color rightcolor = moon.getcolorat(getx() + rightx, gety() + bottom); return (speed <= MAX_LANDING_SPEED) && leftcolor.equals(moon.getlandingcolor()) && rightcolor.equals(moon.getlandingcolor()); * Is the lander exploding? private boolean isexploding() { Color leftcolor = moon.getcolorat(getx() + leftx, gety() + bottom); Color rightcolor = moon.getcolorat(getx() + rightx, gety() + bottom); return!(leftcolor.equals(moon.getspacecolor()) && rightcolor.equals(moon.getspacecolor())); * Check if we are colliding with anything and take appropiate action. private void checkcollision() { if(islanding()) { setimage("rocket.png"); moon.addobject(new Flag(), getx(), gety()); 57

59 Greenfoot.stop(); else if(isexploding()) { moon.addobject(new Explosion(), getx(), gety()); moon.removeobject(this); 58

60 Moon package LunarLander; import java.awt.color; import GameFramework.World; * A moon. * Poul Henriksen public class Moon extends World { Gravity on the moon private double gravity = 1.6; Color of the landing platform private Color landingcolor = Color.WHITE; Color of the space private Color spacecolor = Color.BLACK; Lander * private Lander lander; public Moon() { super(600, 600, 1); lander = new Lander(); addobject(lander, 326, 100); * Gravity on the moon // addobject(new FuelGuage(lander), 135, 40); // addobject(new Speedometer(lander), 135, 80); // Force the explosion to initialise the images // We do this in a thread to make it load in the background new Thread() { public void run() { Explosion.initialiseImages();.start(); 59

61 * public double getgravity() { return gravity; * Color of the landing platform * public Color getlandingcolor() { return landingcolor; * Color of the space * public Color getspacecolor() { return spacecolor; 60

62 SpeedOmeter package LunarLander; import java.awt.font; * Fuel Guage that displays a Lander's Fuel Level. * Allen Hammock public class Speedometer extends Counter { private Lander lander; public Speedometer() { this(new Lander()); public Speedometer(Lander l) { super("speed: "); lander = l; color = java.awt.color.white; updatevalue(); protected final void updatevalue() { value = (int) Math.abs(lander.getVelocity()); 61

63 D: CD med program. På cden er både frameworket der repræsenterer programmet, skrevet til dette projekt og koden til Greenfoot spillet Lunar Lander. Yderligere kan der også findes en API. 62

Dag 10 Flertrådet programmering

Dag 10 Flertrådet programmering Videregående programmering i Java Dag 10 Flertrådet programmering Fremlæggelse af programmering/status for projekter Dokumentation med javadoc Flertrådede designmønstre: Arbejdstråd, Producent Konsument,

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

Bilag 1 Rige billeder Ordremodtagelse

Bilag 1 Rige billeder Ordremodtagelse Bilag1 Rigebilleder Ordremodtagelse Tværfagligtprojektpå2.Semester Bilag afchristian,kennetogmartin 71 Overordnet Tværfagligtprojektpå2.Semester Bilag afchristian,kennetogmartin 72 Produktionsgulvet Tværfagligtprojektpå2.Semester

Læs mere

A Profile for Safety Critical Java

A Profile for Safety Critical Java A Profile for Safety Critical Java Martin Schoeberl Hans Søndergaard Bent Thomsen Anders P. Ravn Præsenteret af: Henrik Kragh-Hansen November 8, 2007 Forfatterne Martin Schoeberl Udvikler af JOP processoren

Læs mere

Michael Jokil 11-05-2012

Michael Jokil 11-05-2012 HTX, RTG Det skrå kast Informationsteknologi B Michael Jokil 11-05-2012 Indholdsfortegnelse Indledning... 3 Teori... 3 Kravspecifikationer... 4 Design... 4 Funktionalitet... 4 Brugerflade... 4 Implementering...

Læs mere

Forord. Roskilde Universitet, december 2011 Jacob Grønlund Dinesen Mads Hansen

Forord. Roskilde Universitet, december 2011 Jacob Grønlund Dinesen Mads Hansen 1 Abstrakt Denne rapport handler om designet og implementeringen af Java2DGames - et simpelt framework til 2D computerspil i Java. Frameworket har til formål at lette udviklingsprocessen af flere forskellige

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 6 Komponenter (og lidt Swing og MVC) Læsning: VP 4, evt. VP 6 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html Grafiske komponenter

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2 DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld

Læs mere

Tree klassen fra sidste forelæsning

Tree klassen fra sidste forelæsning Programmering 1999 Forelæsning 12, fredag 8. oktober 1999 Oversigt Abstrakte klasser. Grænseflader. Programmering 1999 KVL Side 12-1 Tree klassen fra sidste forelæsning class Tree { int age; // in years

Læs mere

HTX, RTG. Rumlige Figurer. Matematik og programmering

HTX, RTG. Rumlige Figurer. Matematik og programmering HTX, RTG Rumlige Figurer Matematik og programmering Vejledere: Jørn Christian Bendtsen og Karl G. Bjarnason Morten Bo Kofoed Nielsen & Michael Jokil 10-10-2011 In this assignment we have been working with

Læs mere

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til [email protected]. Besvarelsen skal

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

BRP 6.9.2006 Kursusintroduktion og Java-oversigt

BRP 6.9.2006 Kursusintroduktion og Java-oversigt BRP 6.9.2006 Kursusintroduktion og Java-oversigt 1. Kursusintroduktion 2. Java-oversigt (A): Opgave P4.4 3. Java-oversigt (B): Ny omvendings -opgave 4. Introduktion til næste kursusgang Kursusintroduktion:

Læs mere

Hvad er Objekter - Programmering

Hvad er Objekter - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som

Læs mere

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004 Overvågningssystem Beskrivelse Bagagesorteringssystemet består af et antal skranker (check-in) til modtagelse og registrering af bagage, et automatiseret sorteringsanlæg samt et antal terminaler (gates),

Læs mere

Kursus navn: Indledende programmering Kursus nr. 02101

Kursus navn: Indledende programmering Kursus nr. 02101 Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning

Læs mere

Løsning af skyline-problemet

Løsning af skyline-problemet Løsning af skyline-problemet Keld Helsgaun RUC, oktober 1999 Efter at have overvejet problemet en stund er min første indskydelse, at jeg kan opnå en løsning ved at tilføje en bygning til den aktuelle

Læs mere

Hvordan vælger jeg dokumentprofilen?

Hvordan vælger jeg dokumentprofilen? Hvordan vælger jeg dokumentprofilen? Valget af OIOUBL profil i en konkret dokumentudveksling vil bl.a. afhænge af, hvilke OIOUBL profiler den anden part i udvekslingen understøtter. Et konkret eksempel

Læs mere

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

//Udskriver System.out.println(Hej  + ditfornavn +   + ditefternavn + .); System.out.println(Du er  + dinalder +  aar gammel! Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for

Læs mere

Roskilde Universitet Forår 2015. First Person Shooter. Datalogi 4. Semester. Forfatter: Jeppe Emil Nygaard Vejleder: Henning Christiansen

Roskilde Universitet Forår 2015. First Person Shooter. Datalogi 4. Semester. Forfatter: Jeppe Emil Nygaard Vejleder: Henning Christiansen Roskilde Universitet Forår 2015 First Person Shooter Datalogi 4. Semester Forfatter: Jeppe Emil Nygaard Vejleder: Henning Christiansen Abstract This project investigates how programming 3D works in java,

Læs mere

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater Design by Contract Design and Programming by Contract Anne Haxthausen [email protected] Informatics and Mathematical Modelling Technical University of Denmark Design by Contract er en teknik til at specificere

Læs mere

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api

Specifikation Abstrakt OO OS-API Rev. 1.7. Specifikation. Abstrakt, objektorienteret operativsystem-api Specifikation Abstrakt, objektorienteret operativsystem-api Indhold 1 Indledning... 3 1.1 Introduktion... 3 1.2 Formål... 3 1.3 Overordnede krav... 3 2 Ressourcer i OS-API et... 4 2.1 Tråde... 4 2.2 Timere...

Læs mere

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Denne guide er oprindeligt udgivet på Eksperten.dk Threads i Java Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Den forudsætter

Læs mere

Ugeseddel 4 1. marts - 8. marts

Ugeseddel 4 1. marts - 8. marts Ugeseddel 4 1. marts - 8. marts Læs følgende sider i kapitel 6 i lærebogen: s. 233 258 og s. 291 317 (afsnit 6.3 overspringes). Begynd at overveje, hvad afleveringsopgaven skal omhandle. Læs vejledningen,

Læs mere

Børn, unge og sundhed

Børn, unge og sundhed Børn, unge og sundhed Automatisering Komm/IT Benjamin Andreas Olander Christiansen, Jens Werner Nielsen og Niclas Larsen Klasse 1.4 Roskilde Tekniske Gymnasium 30.4.2010 Indledning Som vores kommunikations-/informationsteknologis

Læs mere

Test af It-komponent

Test af It-komponent Test af It-komponent I programmeringssproget Java Programmet Login service Elev: Mads Funch Klasse 2.4 Mat, It, Programmering Skole: Roskilde Tekniske Gymnasium HTX Underviser: Karl Dato: 31-08-2016 Side

Læs mere

DANMARKS TEKNISKE UNIVERSITET

DANMARKS TEKNISKE UNIVERSITET DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler

Læs mere

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11 DM503 Forelæsning 11 Generics Pakker Exceptions Indhold Generics Nedarvning og Generics Generics Nedarvning og Generics Husk Box fra sidst Generics public class Box {! private T object;! public void

Læs mere

Introduktion til ActionScript, fortsat

Introduktion til ActionScript, fortsat Introduktion til ActionScript, fortsat Kaspar Rosengreen Nielsen [email protected] i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, [email protected] 1 Dagens program Opsamling

Læs mere

StarWars-videointro. Start din video på den nørdede måde! Version: August 2012

StarWars-videointro. Start din video på den nørdede måde! Version: August 2012 StarWars-videointro Start din video på den nørdede måde! Version: August 2012 Indholdsfortegnelse StarWars-effekt til videointro!...4 Hent programmet...4 Indtast din tekst...5 Export til film...6 Avanceret

Læs mere

Projekt - Valgfrit Tema

Projekt - Valgfrit Tema Projekt - Valgfrit Tema Søren Witek & Christoffer Thor Paulsen 2012 Projektet Valgfrit Tema var et projekt hvor vi nærmest fik frie tøjler til at arbejde med hvad vi ville. Så vi satte os for at arbejde

Læs mere

Singleton pattern i Java

Singleton pattern i Java Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i Java Denne artikel beskriver Singleton pattern og implementation i Java. Den forudsætter kendskab til Java men ikke til Singleton.

Læs mere

SigmaT.

SigmaT. Java + Groovy Disposition Om SigmaT Eksempel på indlejring af Groovy Overvågning af PEM Ønske om dynamisk loaded Java uden at fifle med classloaderen Groovy til hjælp Opsamling hvad jeg ikke har fortalt

Læs mere

02101 Indledende Programmering Introduktion til Eclipse

02101 Indledende Programmering Introduktion til Eclipse 02101 Indledende Programmering Introduktion til Eclipse Version 2018 1 Introduktion I dette kursus lægger vi op til at man bruger det integrerede udviklingsmiljø Eclipse. Basalt set er et integreret udviklingsmiljø

Læs mere

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22.

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22. Klasser og Objekter i Python Uge 46 Learning Python: kap 15-16, 19-22. Klasser og objekter En klasse beskriver en klump af samhørende funktioner og variable En klasse er en beskrivelse. En kage form Klassens

Læs mere

Løsning af møntproblemet

Løsning af møntproblemet Løsning af møntproblemet Keld Helsgaun RUC, oktober 1999 Antag at tilstandene i problemet (stillingerne) er repræsenteret ved objekter af klassen State. Vi kan da finde en kortest mulig løsning af problemet

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 29. februar, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Software Construction 1 semester (SWC) Spørgsmål 1

Software Construction 1 semester (SWC) Spørgsmål 1 Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /

Læs mere

DM536. Rapport og debug

DM536. Rapport og debug DM536 Rapport og debug Kilder Vigtig.it (Felix Palludan Hargreaves) http://vigtig.it/dm502/howto_report.pdf http://vigtig.it/blog/teaching/#toc-relevant-tips Peter Schneider-Kamp http://imada.sdu.dk/~petersk/dm536/project2.pdf

Læs mere

Dokumentation af programmering i Python 2.75

Dokumentation af programmering i Python 2.75 Dokumentation af programmering i Python 2.75 Af: Alexander Bergendorff Jeg vil i dette dokument, dokumentere det arbejde jeg har lavet i løbet opstarts forløbet i Programmering C. Jeg vil forsøge, så vidt

Læs mere

Introduktion til ActionScript

Introduktion til ActionScript Introduktion til ActionScript Kaspar Rosengreen Nielsen [email protected] i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, [email protected] 1 Dagens program Opsamling på

Læs mere

Automatisering Af Hverdagen

Automatisering Af Hverdagen Automatisering Af Hverdagen Programmering - Eksamensopgave 10-05-2011 Roskilde Tekniske Gymnasium (Kl. 3,3m) Mads Christiansen & Tobias Hjelholt Svendsen 2 Automatisering Af Hverdagen Indhold Introduktion:...

Læs mere

SWC eksamens-spørgsmål. Oversigt

SWC eksamens-spørgsmål. Oversigt SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition

Læs mere

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004 Genbrugelige komponenter og designmønstre i Java Jacob Nordfalk Ingeniørhøjskolen i København Nykøbing F itvisioncenter 24. februar 2004 Program Om Jacob Nordfalk introduktion (ikke-teknisk del) Komponentbaseret

Læs mere

Undervisningsbeskrivelse

Undervisningsbeskrivelse Undervisningsbeskrivelse Stamoplysninger til brug ved prøver til gymnasiale uddannelser Termin Institution Uddannelse Fag og niveau Lærer(e) Hold Termin hvori undervisningen afsluttes: maj-juni 2014 HTX

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Objektorienterede metoder

Objektorienterede metoder Objektorienterede metoder Denne gang: Designmønstre Skabende designmønstre: Fabrikeringsmetode/Fabrik, Singleton, Abstrakt fabrik (Toolkit), Prototype, Objektpulje Singleton eksempel: Forskellige slags

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 15. marts, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Klasse 1.4 Michael Jokil 03-05-2010

Klasse 1.4 Michael Jokil 03-05-2010 HTX I ROSKILDE Afsluttende opgave Kommunikation og IT Klasse 1.4 Michael Jokil 03-05-2010 Indholdsfortegnelse Indledning... 3 Formål... 3 Planlægning... 4 Kommunikationsplan... 4 Kanylemodellen... 4 Teknisk

Læs mere

Læringsprogram. Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4

Læringsprogram. Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4 Læringsprogram Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4 R o s k i l d e T e k n i s k e G y m n a s i u m Indholdsfortegnelse FORMÅL...

Læs mere

Afsluttende - Projekt

Afsluttende - Projekt 2014 Afsluttende - Projekt Rapporten er udarbejdet af Ali, Andreas og Daniel Vejleder Karl G Bjarnason Indholdsfortegnelse Indledning... 2 Case... 3 Design... 4 Python kalender:... 4 Poster:... 4 Planlægning...

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3 DM502 Forelæsning 3 Indlæsning fra tastatur Udskrift til skærm Repetition Beregning af middelværdi Gentagelse med stop-betingelse (while) Heltalsdivision Division med nul Type-casting ( (double) ) Betinget

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 20. marts, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Det er muligt at chekce følgende opg. i CodeJudge: og

Det er muligt at chekce følgende opg. i CodeJudge: og Det er muligt at chekce følgende opg. i CodeJudge:.1.7 og.1.14 Exercise 1: Skriv en forløkke, som producerer følgende output: 1 4 9 16 5 36 Bonusopgave: Modificer dit program, så det ikke benytter multiplikation.

Læs mere

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM. Denne guide er oprindeligt udgivet på Eksperten.dk XML parsning i Java Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM. Den forudsætter kendskab til Java og XML.

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2019 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 27. februar, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen. Indledning...2 Variabler...13 Eksempel: 1...13 Eksempel 2:...13 Eksempel 3:...15 Eksempel 4:...16 Metoder...17 Metode (intet ind og intet ud)...17 Metode (tekst ind)...18 Metode (tekst ind og tekst ud)...19

Læs mere

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet.

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet. 8 3. Nedtælling Nu skal du lave en nedtæller. Det er en god måde at lære variabler på og hvordan du skal kode micro:bit til at gøre dét, du vil have, at den skal vise. Du skal bruge: 1 x BBC micro:bit

Læs mere

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben GoogleAppEngine GoogleAppEnginesomplatform ClausMyglegaardVagnerogJacobvonEyben Abstract CloudcomputingerenteknologidervinderfremidengenerelleITinfrastruktur. SocialemediersåsomLinkedIn,TwitterogFacebookharøgetbehovetfor

Læs mere

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation). Denne guide er oprindeligt udgivet på Eksperten.dk RMI introduktion Denne artikel beskriver Java RMI (Remtote Method Invocation). Den beskriver teorien bag RMI, viser et simpelt kode eksempel og forklarer

Læs mere

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0 Program Dokumentation PC Software Skrevet af Gruppen. Version 1.0 Indholds fortegnelse 1. INDLEDNING...3 1.1. FORMÅL...3 1.2. REFERENCER...3 1.3. VERSIONSHISTORIE...3 1.4. DEFINITIONER...3 1.5. DOKUMENTATIONENS

Læs mere