Kursutvärdering. Spel och grafik i Java. Föreläsningarna. Labbar. Föreläsningar-labbar. Översikt. Bra föreläsningar



Relevanta dokument
Fönsterhantering, grafik

Händelsestyrda program

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Fönsterhantering, grafik

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

Programstyrd / händelsestyrd

Laboration 15 Grafiskt användargränssnitt

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Grafiska användargränsnitt i Java. Föreläsning 7 Innehåll. Använda klasspaketet Swing. Klasspaket i Java. Grafiska användargränsnitt i Java

Malmö högskola 2007/2008 Teknik och samhälle

Labbinstruktioner för Java/Swing

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

OOP Objekt-orienterad programmering

2I1049 Föreläsning 8. Grafiska gränssnitt i Java. AWT-komponenter. Grafiska gränssnitt, Java interface och händelsehantering

OOP Objekt-orienterad programmering

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Mer om grafiska komponenter. Händelsestyrda program

Laboration 4: Game of Life

Projekt 2 XL. Observer-mönstret

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna

LiTHehack? Här? lithehack se koma Tisdagar och torsdagar

Föreläsning 3: Händelsestyrda program och användargränssnitt

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Objektorienterad programmering med Java Swing. Programexempel. Swing och AWT AWT. = Abstract windowing toolkit

Grafiska program i Java. AWT och Swing? AWT. Swing. JButton. Button

Java-concept och Swing. Swing low, sweet chariot

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

Rita Egna Bilder, Timer

Föreläsning 14: Grafik & mera händelsehantering

Grafiska komponenter.

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

För att hitta filen gå till mappen NetBeansProjects. Välj undermappen med rätt projekt, och sedan undermapp dist. Där ligger.jar-filen.

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Lektion Händelsehanterare

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

SMD091 Lektion 9. Definition. Inkapsling. Lite repetition. Grafik. Gränssnitt Definition och Implementation. Sammansättning... Implementation.

Tentamen i Objektorienterad programmering

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers. Exempel: FlowLayout. Klassen FlowLayout

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Repetitionsföreläsning 2: Quiz & problemlösning med swing Inget nytt material.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

Modellsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

27. GUI Programming. Java. Summer 2008 Instructor: Dr. Masoud Yaghini

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Frames, menyer och GUI-program

Objektorienterad Programmering DAT043. Föreläsning 6 30/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Malmö högskola 2007/2008 Teknik och samhälle

Modellsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Lab5 för prgmedcl04 Grafik

Föreläsning 13: Swing (GUI), händelser, timer

Laboration 3 GUI-programmering

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Lösningsförslag till tentamen

Klasser för grafik och bildhantering

Föreläsning 10. ADT:er och datastrukturer

Properties. Användbara metoder som kan anropas i propertychanged:

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Du ska nu skapa ett litet program som skriver ut Hello World.

Tentamen FYTA11 Javaprogrammering

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

Arv, Grafiska användaregränssnitt och Inre klasser! Förelasning 12!! TDA540 Objektorienterad Programmering!

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Tentamen i Objektorienterad programmering

Klasser och objekt i C#

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

Arv och Grafiska Användargränssnitt

Arvshierarki. Object. Bostadshus. Flerfamiljshus. Villa

Handbok Blinken. Danny Allen Översättare: Stefan Asserhäll

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna.

Lösningsförslag tentamen FYTA11 Java

5 Användargränssnitt. 5.1 AWT och Swing

Tentamen FYTA11 Javaprogrammering

Monday, November 16, Senaste Labben

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. Exempel på några av komponenterna. LayoutManagers.

LYCKA TILL!!! TENTAMEN I Programmeringsteknik F1. Var vänlig och läs detta: CTH TIN 211. DATAVETENSKAP Göteborg ( ) TENTAMEN

MVC-mönstret. model-view-control i Swing

ANVÄND NAVIGATIONEN I CAPITEX SÄLJSTÖD

Tentamen i Objektorienterad programmering E

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Lösningsförslag till tentamen

Lösningsförslag till tentamen

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? Exempel på några av komponenterna. LayoutManagers.

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

Transkript:

Föreläsningarna Kursutvärdering Bra föreläsningar Bra tempo (2) Bra att man kan påverka innehållet Bra kommunikation på föreläsningarna För svåra föreläsningar Mer kodexempel på grundläggande Java Mer progressivt genomgående» Förklara interfaces, comparator, iterator Introduktionen bör vara tydligare Undvik sidospår Programmering tillämpningar och datastrukturer 2 Föreläsningar-labbar Lätt att hänga med på föreläsningarna, men svårt att tillämpa dem på labbarna Slidesen hjälper på labbarna De moment som varit oklara på föreläsningarna har förklarats och förståtts på labbarna Programmering tillämpningar och datastrukturer 3 Labbar Bra labbhandledning (2) Svårt att testa innan man skrivit klart hela koden Svar: Obs att iteratorn inte behöver kodas innan man kan testa listor Tydligare instruktioner till labbarna Är det meningen att vi ska klara labbarna eller att vi ska lära oss hitta information själva? Svar: Båda. Labbarna ska stödja er inlärning, men de är inget självändamål Programmering tillämpningar och datastrukturer 4 Översikt Spel och grafik i Java Grafiska komponenter Övergripande design Måla egna komponenter Demo av exempelkod Användning av State Observer Timer Att ta tiden Hur länge en knapp är intryckt Kollisionsdetektion Programmering tillämpningar och datastrukturer 6

Grafiska paket i Java java.awt Gamla fönsterhanteringsklasser java.awt.event Händelsestyrning javax.swing Nya J klasser Vanligast använda: JFrame LayoutManager JPanel JLabel JButton Grafiska komponenter Programmering tillämpningar och datastrukturer 7 Programmering tillämpningar och datastrukturer 8 JFrame Vanligt fönster med ramar, titelrad och stängningsknapp Layout-manager ContentPane Själva fönsterytan Protokoll för JFrame Konstruktor: JFrame(String titelrad) setdefaultcloseoperation(int op) Använd t.ex. Jframe.EXIT_ON_CLOSE add(component comp) setsize(int width, int height) setsize(int startx, int starty, int w, int h) Programmering tillämpningar och datastrukturer 9 Programmering tillämpningar och datastrukturer 10 Protokoll för JFrame setlayout(layoutmanager manager) add(component comp) remove(component comp) pack() // anpassa fönsterstorlek till innehåll setvisible(boolean) // detta bör göras sist Exempelkod public QuickDraw() { // konstruktorn super("quickdraw"); // skapa yttre fönstret setlayout(new BorderLayout()); // välj layout på innehållet add(mydrawsurface, BorderLayout.CENTER); // lägg i mitten add(mytoolbar, BorderLayout.WEST); // lägg till vänster setvisible(true); // visa på skärmen nu Programmering tillämpningar och datastrukturer 11 Programmering tillämpningar och datastrukturer 12

Panel utan ramar JPanel Målarduk som kan fylla upp en viss del av ett fönster Enligt fönstrets layout Kan i sin tur ha en given layout Kan stackas rekursivt, dvs. Jpanel i Jpanel, enigt en viss layout Protokoll för JPanel JPanel(LayoutManager layout) add(component c) Remove(Component c) paintcomponent(graphics g) repaint() Programmering tillämpningar och datastrukturer 13 Programmering tillämpningar och datastrukturer 14 JLabel Används för att hålla en ikon eller en testremsa Brukar därför ligga på näst sista nivån i behållar-hierarkin Exempelkod JLabel score; score = new JLabel("0", JLabel.CENTER); score.setfont(new Font("SansSerif", Font.BOLD, 18)); score.setforeground(color.red); score.setalignmentx(center_alignment); Programmering tillämpningar och datastrukturer 15 Programmering tillämpningar och datastrukturer 16 JButton Knappar som kan innehålla text eller ikon Protokoll för AbstractButton JButton(String text, Icon icon) JButton(Icon icon) JButton(String text) seticon(icon defaulticon) Programmering tillämpningar och datastrukturer 17 Programmering tillämpningar och datastrukturer 18

Protokoll för JButton Exempelkod boolean isdefaultbutton() isselected() Hela knappen Kan även testa för press, rollover Icon getselectedicon() addactionlistener(actionlistener listener) Programmering tillämpningar och datastrukturer 19 public class ShapeButton extends JButton { public ShapeButton(String txt, ) { // konstruktor super(txt); addmouselistener(this); Programmering tillämpningar och datastrukturer 20 Exempelkod BorderLayout /** Enkelt ritprogram */ public class QuickDraw extends JFrame { public QuickDraw() { // konstruktorn super("quickdraw"); // skapa fönstret setlayout(new BorderLayout()); setvisible(true); Fem regioner NORTH SOUTH EAST WEST CENTER (default) Skapa nytt objekt Panel p = new JPanel(); p.setlayout(new BorderLayout()); p.add(new Button("OK"), BorderLayout.SOUTH); Programmering tillämpningar och datastrukturer 21 Programmering tillämpningar och datastrukturer 22 BorderLayout GridLayout WEST NORTH CENTER EAST Matris-mönster Alla komponenter ges samma utrymme Dvs. lika stora rutor SOUTH Programmering tillämpningar och datastrukturer 23 Programmering tillämpningar och datastrukturer 24

FlowLayout Komponenterna läggs upp i en rad Komponenterna skalas inte Får inte alla komponenter plats bredvid varandra påbörjas ny rad Automatisk omplacering om fönsterstorleken skulle ändras BoxLayout Som FlowLayout, men med fler kontrollmöjligheter: Kan lägga raden vertikalt Kan påverka regionernas storlek setpreferredsize(new Dimension(10, 30)); Fyllnad mellan regionerna createridigarea(new Dimension(20, 100)); Programmering tillämpningar och datastrukturer 25 Programmering tillämpningar och datastrukturer 26 Grafiska komponenter Dubbel funktion Kan vara behållare Kan vara komponent i en behållare Alla klasser kan dock inte ligga ytterst Två typer Tungviktiga Kan ligga ytterst, t.ex. JFrame Lättviktiga Måste ligga i en annan komponent Tungviktiga komp. i Swing JApplet, JDialog, JFrame, JWindow Använder operativsystemets grafiska funktioner Plattformsberoende Har direktkontakt med operativsystemet Programmering tillämpningar och datastrukturer 27 Programmering tillämpningar och datastrukturer 28 Lättviktiga komp. i Swing Klassdiagram för Component JComponent och dess subklasser Får utrymme tilldelat inom en tungviktskomponent Panel Window Object Component Container JComponent Applet Dialog Frame JWindow JApplet JDialog JFrame JSlider JToolBar JOptionPane AbstractButton JLabel JPanel JTextComponent JButton JMenuItem JTextField JTextArea JComboBox JToggleButton JMenu Programmering tillämpningar och datastrukturer 29 JCheckBox JRadioButton JComponent kan läggas i Jframe kan rita upp sig Programmering tillämpningar och datastrukturer 30

Komponenter Bygga egen Container-hierarki Komponenter kan i sin tur vara behållare för andra komponenter Component Container Behållar-hierarki (Container hierarchy) Window JComponent Frame JFrame AbstractButton JLabel JPanel JButton Programmering tillämpningar och datastrukturer 31 Programmering tillämpningar och datastrukturer 32 Dataspel Värld Grafiska dataspel Aktörer Mer eller mindre självständiga Tidsflöde Programmering tillämpningar och datastrukturer 34 Dataspelets delar Aktörerna: Sprites Grafik Intern representation av alla aktörer Uppdateringsloop Inmatning Sprites betyder älva 2D-former Dynamiskt uppritade i Java Eller t.ex. transparenta gif-bilder Från webben Eller t.ex. programmet Gimp för att skapa bilderna Använd ImageIcon för bildinläsning Programmering tillämpningar och datastrukturer 35 Programmering tillämpningar och datastrukturer 36

Rita upp egen komponent Vad är ett Graphics-objekt? Verktygslåda för att visualisera, rita Ärv från JComponent (eller subklass) Se till att din egen klass ligger uppe på skärmen!!! Dvs. att din klass finns med i behållarhierarkin Gör egen definition av void paintcomponent(graphics g) Kommer ihåg vilken enhet man ritar på Skärmfönster, printer, Kommer ihåg vilken färg på penseln, etc. Nödvändig för uppritning Programmering tillämpningar och datastrukturer 37 Programmering tillämpningar och datastrukturer 38 Exempelkod public void paintcomponent(graphics g) { g.setcolor(color.white); // vit bakgrund g.fillrect(0, 0, mywidth, myheight); // rita upp figuren g.filloval(0, 0, width, height); Programmering tillämpningar och datastrukturer 39 Hur få ett Graphics-objekt? Hur få ett Graphics-objekt? Uppritning av förgrundsfigurer Uppritning i Java: 1. Java tar emot kommando från dig: repaint() 2. Java ritar upp bakomliggande saker, fönsterram, etc. 3. Java skapar ett Graphics-objekt åt dig som innehåller information om plats för uppritning, etc. 4. Java anropar din paintcomponent(graphics g) 5. Du kan nu rita upp din lilla ruta, bakgrund, samt din(a) förgrundsfigur(er) Du anropar alltså repaint() varje gång du vill uppdatera din rityta Anropa inte paintcomponent(graphics g) Java gör detta åt dig När du väl fått ett Graphics-objekt till paintcomponent kan du skicka vidare Graphics-objektet till alla dina förgrundsfigurer, och be dem rita upp sig Programmering tillämpningar och datastrukturer 41 Programmering tillämpningar och datastrukturer 42

Exempelkod repaint(); public void paintcomponent(graphics g) { g.setcolor(color.white); g.fillrect(0, 0, getwidth(), getheight()); allshapes.drawall(g); // rita mina figurer Varje figur är ett eget objekt För varje förgrundsfigur måste du skapa ett nytt objekt T.ex. new Sprite(); Detta objekt ska kunna rita upp sig T.ex. draw(graphics g); draw() kommer att anropas av en central uppritare som ritar upp hela spelytan paintcomponent(graphics g) { mysprite.draw(g); Programmering tillämpningar och datastrukturer 43 Programmering tillämpningar och datastrukturer 44 Att tänka på Alla sprites bör vara samlade i en lista T.ex. allsprites Del av din spelvärld Viktigt att skilja denna från själva displayen Så få beroenden som möjligt mellan dessa Helst enkelriktat beroende Övergripande design Programmering tillämpningar och datastrukturer 45 Spelexempel: MiniMario JComponent Listen -world -display MarioWorld Display -world +paintcomponent() Demo ListenToTimer ListenToKey +updateworld() +drawall() Paper DisplayOnScreen -frame +actionperformed() +keypressed() +keyreleased() MarioWorld AlternativeWorld +paintcomponent() +paintcomponent() +updateworld() +drawall() +updateworld() +drawall() keypressed() keypressed = Calendar.getInstance().getTimeInMillis(); keyreleased() { myworld.getplayer().jump(jumpheight, jumplength); mydisplay.repaint();; Programmering tillämpningar och datastrukturer 47

Modell MarioWorld.updateWorld() public void updateworld() { updateobstacles(); Sprite updateworld() { for all sprites: updatel(); World -mypos +updateworld() +move() +drawall() 1 +jump() * MarioWorld AlternativeWorld Player Obstacle Tree +updateworld() +updateworld() +drawall() +drawall() Programmering tillämpningar och datastrukturer 49 updatetrees(); for (Iterator<Tree> itr = alltrees.iterator(); itr.hasnext();) { itr.next().move(); for (Iterator<Obstacle> itr = allobstacles.iterator(); itr.hasnext();) { itr.next().move(); for (Iterator<Sprite> itr = allsprites.iterator(); itr.hasnext();) { itr.next().move(); Programmering tillämpningar och datastrukturer 50 MarioWorld.drawAll() public void drawall(graphics g) { for (Iterator<Tree> itr = alltrees.iterator(); itr.hasnext();) { itr.next().draw(g); for (Iterator<Obstacle> itr = allobstacles.iterator(); itr.hasnext();) { itr.next().draw(g); for (Iterator<Sprite> itr = allsprites.iterator(); itr.hasnext();) { itr.next().draw(g); Yttre behållare Programmering tillämpningar och datastrukturer 51 Topp-nivå behållare Händelser Sköter utskick av händelser som orsakas externt (exvis. av användaren) Musknappar Musrörelser Tangentnertryckning Kan dessutom behöva använda interna händelser Ex. timer Topp-nivå containers fångar upp signaler från operativsystemet Skickar vidare till komponenterna Specifika händelser (Event) skapas Skickas ut till alla lyssnare Lyssnare = komponent som har prenumererat på information från den här behållaren Programmering tillämpningar och datastrukturer 53 Programmering tillämpningar och datastrukturer 54

Component Vilka typer av prenumerationer finns det? Window +addmouselistener() +addkeylistener() +addfocuslistener() +addcomponentlistener() Container +addcontainerlistener() Alla dessa metoder tar komponent som argument, t.ex. this JComponent +addwindowlistener() +addchangelistener() +addpropertychangelistener() Frame AbstractButton +addactionlistener() JFrame JButton JLabel JPanel Programmering tillämpningar och datastrukturer 56 EventListener ActionEvent KeyEvent MouseEvent FocusEvent WindowEvent Vilka får prenumerera? EventListener ActionListener +ActionPerformed() KeyListener +KeyTyped() +KeyPressed() +KeyReleased() KeyAdapter MouseListener +MouseClicked() +MousePressed() +MouseReleased() +MouseEntered() +MouseExited() FocusListener +FocusGained() +FocusLost() WindowListener +WindowOpened() +WindowClosing() +WindowClosed() +WindowIconified() +WindowDeiconified() +WindowActivated() +WindowDeactivated() MouseMotionListener +MouseDragged() +MouseMoved() WindowAdapter MouseAdapter MouseMotionAdapter Programmering tillämpningar och datastrukturer 58 Events När man klickar med musen skickar operativsystemet meddelande till toppnivå behållaren, ex.vis. till JFrame Denna skapar ett internt meddelande Ex.vis. KeyEvent Skickas ut till de objekt som har prenumererat på den här typen av meddelande De som prenumerar på KeyEvent måste implementera gränssnittet KeyListener Hur ser ett Event ut? Programmering tillämpningar och datastrukturer 59

Klassen KeyEvent Klassen KeyEvent public static final int VK_ENTER public static final int VK_TAB = '\n'; = '\t'; /** * Constant for the non-numpad left arrow key. * @see #VK_KP_LEFT */ public static final int VK_LEFT = 0x25; /** * Constant for the non-numpad up arrow key. * @see #VK_KP_UP */ public static final int VK_UP = 0x26; int getkeycode() Returnerar tangentkod som motsvarar de konstanter som deklarerades i början av klassen char getkeychar() Returnerar bokstäver (ex. A för shift+a) Programmering tillämpningar och datastrukturer 61 Programmering tillämpningar och datastrukturer 62 int getx(); int gety(); int getbutton(); MouseEvent Exempelkod class ListenForPlayerInput implements MouseListener { public void mouseentered(mouseevent e) { activated = true; public void mouseclicked(mouseevent e) { if (activated) { gameworld.getplayer().moveforward(); Programmering tillämpningar och datastrukturer 63 Programmering tillämpningar och datastrukturer 64 Sprites Befolkar spelvärlden Sprites Kan rita upp egna figurer i Java Kan hämta in bilder från webben eller från saker man ritat i ett ritprogram Programmering tillämpningar och datastrukturer 66

Exempel: imageicon.painticon() Exempel: g.drawimage() public class Tree extends Sprite { private ImageIcon icon = new ImageIcon("C:/Users/ritko/Documents/figures/tree.gif"); public class Tree extends Sprite { private ImageIcon icon = new ImageIcon("C:/Users/ritko/Documents/figures/cactus.gif"); private Image img = icon.getimage(); public void draw(graphics g) { icon.painticon(this, g, (int) mypos.getx(), (int) mypos.gety()); public void draw(graphics g) { g.drawimage(img, (int) mypos.getx(), (int) mypos.gety(), null); Programmering tillämpningar och datastrukturer 67 Programmering tillämpningar och datastrukturer 68 Graphics2D Detta är egentligen det man får till sin paintcomponent() Måste göra downcast för att få tillgång till Graphics2D protokollet Ger tillgång till fler metoder public void draw(graphics g) { Graphics2D g2 = (Graphics2D) g; g2.rotate( ); Exempel Graphics2D public void draw(graphics g) { Graphics2D g2 = (Graphics2D) g; //spara nuvarande transformation AffineTransform transf = g2.gettransform(); // Ange rotation för utritning g2.rotate(math.toradians(45), (int) mypos.getx(), (int) mypos.gety()); // rita roterat g2.setcolor(color.red); g2.fillrect((int) mypos.getx(), (int) mypos.gety(), width, height); // återställ transformen g2.settransform(transf); Programmering tillämpningar och datastrukturer 69 Programmering tillämpningar och datastrukturer 70 Kollisionsdetektion Kollisionsdetektion Använd omgivande rektanglar Klassen Rectangle Rectangle r = new Rectangle(); if (r.intersects(r2) {... if (r.contains(point) {... Programmering tillämpningar och datastrukturer 72

Löpa igenom alla sprites Kan vara problematiskt om man vill rensa bort element i en lista som man håller på att löpa igenom ConcurrentModificationException Bäst att använda en iterator Exempelkod iterator Iterator<Sprite> itr = alltrees.iterator(); while (itr.hasnext()) { if (itr.next().getx() < -100) { itr.remove(); // destruction of trees outside the playarea Programmering tillämpningar och datastrukturer 73 Programmering tillämpningar och datastrukturer 74 Slumptal import java.util.random; Random rand = new Random(); width = (int) (rand.nextdouble()*20 + 15); height = (int) (rand.nextdouble()*100 + 50); Timer Programmering tillämpningar och datastrukturer 75 Uppdateringsloopen Ser till att alla aktörer (sprites) agerar (t.ex. rör sig) Istället för while-loop while (spelet är igång) { Använd klocksignal Tidur (timer) Lyssnare som sedan anropar model.update(); model.repaint(); Timer Ett objekt kan registrera sig hos en timer som kommer att generera händelser av typen ActionEvent Programmering tillämpningar och datastrukturer 77 Programmering tillämpningar och datastrukturer 78

Timer Finns även annan timer, vi vill ha just denna public class ListenToTimer extends Listen implements ActionListener { private javax.swing.timer timer; public ListenToTimer(World world, Display display, int timestep) { myworld = world; mydisplay = display; timer = new javax.swing.timer(timestep, this); timer.start(); Att ta tiden public void actionperformed(actionevent e) { myworld.updateworld(); mydisplay.repaint(); Programmering tillämpningar och datastrukturer 79 Hur länge en knapp hålls nertryckt public void keypressed(keyevent ev) { Hur länge en knapp hålls nertryckt public void keyreleased(keyevent ev) { switch (key) { case KeyEvent.VK_UP: timepressed = System.currentTimeMillis(); break; switch (key) { case KeyEvent.VK_UP: timereleased = System.currentTimeMillis(); timeheld = (int) timereleased timepressed; break; Programmering tillämpningar och datastrukturer 81 Programmering tillämpningar och datastrukturer 82 Delegering till State Hus State kan användas Alla sprites har ett tillstånd T.ex Walking T.ex. Jumping Dessa funktioner delegeras till State: Förflyttning move() Uppritning draw() Programmering tillämpningar och datastrukturer 84

State Kodexempel public void jump(double height, int duration) { if (!(mystate instanceof Jumping)) { Sprite -mypos State mystate = new Jumping(myPos.getY(), height, duration); +move() +jump() +move() mystate.move(mypos); Player Obstacle Tree Stationary Walking Jumping +move() +move() +move() Programmering tillämpningar och datastrukturer 85 Programmering tillämpningar och datastrukturer 86