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

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

Laboration 3 GUI-programmering

TDDI82 - Projekt. Christoffer Holm. Institutionen för datavetenskap (IDA)

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

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Laboration 1: Figurer i hierarki

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

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

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

TDDC74 - Projektspecifikation

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 5. Laboration 4 Lådplanering Exempel på grafik, ett avancerat program Frågor

Tor Sterner-Johansson Thomas Johansson Daniel Henriksson

Projektuppgift - Biblioteket

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

ID1004 Laboration 3, 5-6 November 2012

Design och konstruktion av grafiska gränssnitt

Laboration 1 - Grunderna för OOP i Java

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

TDDE10 TDDE11, 725G90. Gemensam kurswebsida på:

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Tentamen i Objektorienterad programmering

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

JAVA Mer om klasser och objektorientering

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

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

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

Lab5 för prgmedcl04 Grafik

TDDE10 TDDE11, 725G91/2. Objektorienterad programmering i Java, Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

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

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

Programmering för språkteknologer II, HT2014. Rum

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

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

Föreläsning 13 Innehåll

Praktikum i programvaruproduktion

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

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

Parallellism, återblick

Fyra i rad Javaprojekt inom TDDC32

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

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

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Programmering för språkteknologer II, HT2011. Rum

Tentamen i Grundläggande programmering STS, åk 1 lördag

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

JavaRats. Kravspecifikation. Version 1.1. Gustav Skoglund Marcus Widblom Senast ändrad: 13 / 05 / 08

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

Kravspecifikation TDP005 Projekt: Objektorienterat system

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 5. Laboration 4 Lådplanering Exempel på layout, ett GUI-baserat program Frågor

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

TENTAMEN I DATAVETENSKAP

Kravspecifikation. Sammanfattning. Fyra i rad Javaprojekt inom TDDC32. Version 2.0. Datum Dokumentnummer

Lösningsförslag tentamen FYTA11 Java

Laboration 3, uppgift En klass för en räknare

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Föreläsning 2, vecka 6: Tillstånd i objektorienterade program (och mera interface)

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

Tentamen, EDAA10 Programmering i Java

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

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

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TDDD78, TDDE30, 729A Grafik: Att "rita" egna komponenter

Projektuppgift - Gymmet

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

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

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

Inkapsling (encapsulation)

Space Invaders - Slutrapport

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Klasshierarkier - repetition

Design av en klass BankAccount som representerar ett bankkonto

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

TENTAMEN OOP

Föreläsning 5-6 Innehåll

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

Imperativ programmering. Föreläsning 4

DAT043 Objektorienterad Programmering

Objektorienterad analys och design

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

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Objekt-orienterad utveckling. Objektorienterad analys och design. Objekt-orienterad programutveckling. Objekt-orienterad analys och design: Litteratur

Transkript:

TDDE0 m.fl. Objektorienterad programmering i Java Föreläsning 9 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Projekt Omfattning, Upplägg Kravspecifikation Tips & Trix Spel-loop Buffra bilder Kollisionsdetektering

Projekt Upplägg Fö Fö KS godkänd Redovisning v7 Börja skriv KS Deadline KS v8 v9 v0 Börja koda Handeldning vid behov! Deadline Reflektion 2

Projekt (2) Omfattning Ett arkadspel skall göras! Spelare mot spelet Grafiskt gränssnitt som styrs med tangentbord och mus. Flera banor, fiender, powerups o.s.v. Meny, med bl.a. highscore. (d.v.s. poäng) 3

Projekt (3) Resurser Grupper om 2 (samma som laborationerna) Handledare finns att tillgå Knappt 3 veckor kalendertid. Två föreläsningar, (Krav, Tips, Versionshantering) En lektion (OOA-workshop) Projektpass i datorsalarna (ej handledare). GitLab Projektet är i stort sett helt självständigt arbete. 4

Projekt(4) Exempel 5 Robotron, Missle Command, m.fl.

Projekt (5) Övriga krav (icke-funktionella) Skall vara skrivet i Java. Får använda annat grafiskt lib än Swing, men då kan man inte förvänta sig hjälp med det. Skall versionshanteras med git/gitlab Handledaren skall bjudas in till projektet. Åtminstone 2 moduler (paket). Lämpligt att dela på grafik och logik. Javadoc skall finnas på klasser (endast kort beskrivning av vad klassen representerar krävs). 6

Projekt (6) Redovisning Godkänd kravspec. Godkänd muntlig demo vid redovisningstillfället. Kraven uppfyllda. Koden OK. Godkänt reflektionsdokument ( per grupp). 2-3 A4 om ert lärande under projektet. Översiktligt klassdiagram. 7

Kravspecifikation Vad som skall ingå: Er vision, d.v.s. en löpande text om hur spelet skall vara. Ca A4 text. En eller flera bilder (skisser) över hur spelet ser ut när man spelar, med förklarande texter. Helt OK att rita detta för hand. En tabell över konkreta, funktionella krav. Ca 5-25 st är rimligt. Skickas som PDF till handledaren senast kl 7.00 måndagen den 20:e februari Handledaren ger er svar senast nästa dag. När kravspecen är godkänd så kan ni börja koda! 8

Kravspecifikation (2) Hur är en kravspec för mjukvara? Fokus för detta projekt. Beskriver funktionaliteten. Vad programmet skall göra. Beskriver gränssnitt(en). Hur programmet interagerar med omvärlden (människor såväl som andra system). Beskriver andra attribut, t.ex. Portabilitet, hållbarhet, säkerhet, o.s.v. Andra begränsningar för systemet, t.ex. Implementationsspråk, resursbegränsning, o.s.v. Går inte in på design eller implementationsdetaljer! 9 IEEE Std 830-998: Recommended Practice for System Requirements Specifications

Kravspecifikation (3) Vilka krav behövs? Kraven arbetas fram tillsammans med kund och andra intressenter. Ofta används use-cases och scenarion även här, för att kunna identifiera systemets viktiga delar. I detta fall agerar ni både kund och utvecklare. Ni får alltså själva komma fram till vilka krav som behövs! Tips: Använd er vision och era skisser. Se även mini-kraven på kurshemsidan. Vi (handledare, examinator) finns med som yttre intressenter. 0 IEEE Std 830-998: Recommended Practice for System Requirements Specifications

Kravspecifikation (4) Hur skriver man ett krav? Det finns vissa karaktäristika som är viktiga för krav. Ett krav skall vara: Korrekt Om kravet inte skall gälla för programmet så är det inte korrekt. Icke tvetydigt Ett krav får inte ha flera tolkningar. Termer kan behöva definieras i en ordlista. Verifierbart Det måste gå att avgöra om kravet är uppfyllt. Spårbart Konsistent Ett krav får inte motsäga ett annat krav, eller andra delar av kravspecen (t.ex visionen, skissen). Rankat Vissa krav är viktigare än andra. Alla krav bör ha något mått så att man vet vad som bör prioriteras. IEEE Std 830-998: Recommended Practice for System Requirements Specifications Vi måste kunna referera till ett krav. Själva texten i ett krav kan ju ändras. Görs lättast med nummer. Icke redundant Om ett krav överlappar med ett annat kan detta leda till fel senare...

Kravspecifikation (5) Ev. redundant Det skall finnas åtta olika former i spelet. Spelaren skall kunna rotera en form genom att trycka på en tangent. Spelet skall visa upp spelarens nuvarande poäng. Spelet skall visa vilken av de sju formerna som kommer härnäst. Formerna skall dyka upp i spelets underkant och röra sig nedåt. När en rad är komplett så skall den försvinna och spelaren får poäng för den. Former kan roteras med mellanslag så länge de inte har landat. Spelets grafiska design skall vara snygg och användarvänlig. Ej konsistent Tvetydigt Vad är komplett? Vad är en rad? Ej spårbara Ej verifierbart Vad är snyggt? Vad är användarvänligt? Ej korrekt Ej rankade 2 IEEE Std 830-998: Recommended Practice for System Requirements Specifications

Kravspecifikation (6) ID 2 3 Ev. redundant 4 5 6 7 8 Beskrivning. Det skall finnas åtta sju olika former i spelet. Spelaren skall kunna rotera en form genom att trycka på en tangent. Spelet skall visa upp spelarens nuvarande poäng. Spelet skall visa vilken av de sju formerna som kommer härnäst. Formerna skall dyka upp i spelets underkant överkant och röra sig nedåt. När en rad är komplett så skall den försvinna och Se definitionerna för rad och spelaren får poäng för den. komplett i ordlistan. Former kan roteras med mellanslag så länge de inte har landat. Spelets grafiska design skall vara snygg och användarvänlig. Varje form skall ha en egen färg. Minst innebär viktigast Prio 2 2 Ej konsistent Tvetydigt Vad är komplett? Vad är en rad? Ej spårbara Ej verifierbart Vad är snyggt? Vad är användarvänligt? Ej korrekt Ej rankade 3 IEEE Std 830-998: Recommended Practice for System Requirements Specifications

Kravspecifikation (6) ID 2 3 4 5 6 7 8 Beskrivning. Det skall finnas åtta sju olika former i spelet. Spelaren skall kunna rotera en form genom att trycka på en tangent. Spelet skall visa upp spelarens nuvarande poäng. Spelet skall visa vilken av de sju formerna som kommer härnäst. Formerna skall dyka upp i spelets underkant överkant och röra sig nedåt. När en rad är komplett så skall den försvinna och Se definitionerna för rad och spelaren får poäng för den. komplett i ordlistan. Former kan roteras med mellanslag så länge de inte har landat. Spelets grafiska design skall vara snygg och användarvänlig. Varje form skall ha en egen färg. Minst innebär viktigast Prio 2 2 4 IEEE Std 830-998: Recommended Practice for System Requirements Specifications

Kravspecifikation (7) Övriga tips Låt åtminstone 3 av era krav vara lägre prioriterade så att ni har några extra saker att göra om ni blir klara tidigt. Om ni inte hinner med dessa så är det inte hela världen. Ni behöver inte fler än 3 prio-nivåer. Välj något välkänt spel och gör er egen variant av det. Ni hinner troligtvis inte att både designa ett nytt spel och implementera det. 5

Tips! Ritprogrammet (lab 3) är ju nästan ett spel... Ni kan säkert återanvända en del kod, eller åtminstone idéer från lab 3. Även här: jobba objektorienterat! Ni kommer säkert behöva ändra mycket i koden medans ni jobbar. Använd det ni har lärt er! D.v.s. klasshirarkier, polymorfi, abstrakta klasser, inkapsling. 6

Spel-Loop De allra flesta spel har någon form av spel-loop. Generell form: while (speletejslut) { hanteraindata(); // t.ex. mus, tangentbord uppdateramodell(); // Alla objekt uppdateras ritautallt(); // Uppdateringarna visas för // spelaren väntaenkortstund(20ms); } 7

Spel-Loop (2) De allra flesta spel har någon form av spel-loop. Generell form: while (speletejslut) { hanteraindata(); uppdateramodell(); ritautallt(); } T.ex. Thread.sleep(20); väntaenkortstund(20ms); Med swing behövs ev. inte denna, då indata kan hanteras av lyssnare och händelser. Modellen går igenom alla sina objekt och talar om för dem att uppdatera sig själva. Ex: for (ModelObject mo : modelobjects) { mo.updateyourself(this); } T.ex. repaint() eller paintimmediately() på GUIt Tips: Anropa Toolkit.getDefaultToolkit().sync(); direkt efter utritning om spelet verkar hacka. (Kan dock bero på annat också). 8

Spel-Loop (3) Thread.sleep() kan variera ett par ms. Uppdatering av model, kan också ta variabel tid. Egentligen bör man mäta hur lång tid varje del i spelloopen tar. Kan göras med System.currentTimeMillis() Därefter räknar man ut hur lång tid man skall vänta. Uppdatering av modellen bör då bero av tiden som gått sedan föregående uppdatering. 9

Spel-Loop (4) En annan approach är att låta uppdateringen också vara en händelse. I Swing finns en timer-klass just för detta ändamål! Timer t = new Timer(20, new ActionListener() { public void actionperformed(actionevent e) { uppdateramodell(); ritautallt(); Toolkit.getDefaultToolkit().sync(); } }); t.start(); 20

Buffra bilder Ni kommer säkert att vilja ha bilder, s.k. sprites i ert spel. Enklast är det nog att låta objekten själva rita ut dessa bilder: public void paintyourself(graphics g) { BufferedImage im = ImageIO.read( new File( sprites/bad.png )); g.drawimage(x, y, im, null); } Men vad händer när vi har många objekt? Alla dessa skall läsa filen varje gång spelet skall ritas ut. Även en liten bild kan då ta tid. 2

Buffra bilder (2) Lösning : Spara bilden som en klassvariabel. private static BufferedImage image = null; private static BufferedImage getimage() { if (image == null) { ImageIO.read(new File( sprites/bad.png )); } return image; } public void paintyourself(graphics g) { g.drawimage(x, y, getimage(), null); } 22

Buffra bilder (3) Lösning 2: Spara alla bilder i en separat managerklass. Den klassen ansvararför att bilder läses in enn gång. public void paintyourself(graphics g) { g.drawimage(x, y, SpriteManager.getImage( bad.png ), null); } 23

Buffra bilder (4) Andra tips om sprites Graphics-objektet kan rita ut bara en del av en bild. Kan vara praktiskt att använda sprite maps. Animationer kan vara en sprite map, där man tickar fram mellan bilderna. Graphics kan hantera transparens i bilder. 24

Kollisioner Ni kommer troligtvis behöva en del klasser för att sköta geometri i ert program. T.ex., hur vet vi om skeppet kolliderat med asteroiden? Finns många bra klasser i java.awt och java.awt.geom T.ex. Point2D.Double, för att hantera punkter i planet. Dimension, för att hantera storlek (bredd, höjd) Rectangle, för att representera en rektangel. 25 Line2D, för att representera en linje.

Kollisioner (2) Lösning : Se objekten som rektanglar och kolla om dessa överlappar. rect rect2 Rectangle rect = new Rectangle(ship.getX(), ship.gety(), ship.getwidth(), ship.getheight()); Rectangle rect2 = new Rectangle(rock.getX(), rock.gety(), rock.getwidth(), rock.getheight()); if (rect.intersects(rect2)) { // objekten har kolliderat! } 26

Kollisioner (3) Finns även funktion för att se om en sträcka beskär en rektangel. rect2 (Xb, Yb) (Xa, Ya) Rectangle rect2 = new Rectangle(rock.getX(), rock.gety(), rock.getwidth(), rock.getheight()); Line2D line = new Line2D(Xa, Ya, Xb, Yb); if (rect.intersects(line)) { // linjen beskär rektangeln. } 27

Concurrent Modification Antag att vi i modellen (GameModel) har följande någonstans i en metod: for (GameObject obj : allobjects) { obj.doyourstuff(this); } Och att vi även har denna metod i GameModel: public List<GameObject> getallobjects() { return allobjects; } Vad händer om vi i doyourstuff gör detta: 28 gamemodel.getallobjects().remove(...)

Concurrent Modification (2) Vi ändrar ju på en lista medans vi itererar igenom den Vägar runt detta: Markera objekt för borttagning. Samla objekt som skall tas bort I en skräplista, och ta bort dem efter. I båda dessa fall, ta bort elementen efter for-eachloopen. 29