TDDI82 - Projekt Christoffer Holm Institutionen för datavetenskap (IDA)
1 Projektkrav 2 Projektplannering 3 Spelutveckling
1 Projektkrav 2 Projektplannering 3 Spelutveckling
3 / 26 Upplägg Spåna projektidé Planering Koda på! 23/4 23/5 25/4 Bilda Grupp 4/5 git kontroll 1/5 Lämna in kort beskrivning 11/5 git kontroll 9/5 Lämna in statusrapport 18/5 git kontroll 22/5 Redovisning
4 / 26 Projektbeskrivning Vad går projektet ut på? Fokus i kursen är på programmering Vad ni gör för projekt är helt upp till er...... men diskutera er projektidé med er handledare Projektet ska vara objektorienterat Tillståndet i ert projekt ska vara uppbyggt från en extern resurs Kraven är designade med spel i åtanke, men vi är öppna för alla typ av projekt!
1 Projektkrav 2 Projektplannering 3 Spelutveckling
6 / 26 Projektplannering Objektorienteradanalys (OOA) Viktiga frågor man måste besvara innan man kan börja programmera: Vilka klasser ska finnas i vårt projekt? Vad ska dessa klasser ha för ansvar? Vilka funktioner ska finnas i varje klass? Att svara på dessa frågor är svårt...
7 / 26 Projektplannering Objektorienteradanalys (OOA) Verktyg för att förenkla planeringen: CRC-kort Klassdiagram Kallas objektorienteradanalys (OOA).
8 / 26 Projektplannering CRC-kort Klassnamn Ansvar Kollaboratörer Står för class-responsibility-collaboration, ett CRC-kort för varje klass, Skriv alla ansvar klassen har i vänstra kolumnen, Högra kolumnen innehåller alla kollaboratörer. Tips: leta efter substantiv i er projektbeskrivning!
9 / 26 Projektplannering CRC-kort - Exempel Visa tiden Ändra tiden Byta batteri Klocka LCD-display LCD-display, knappar Batteri Bil Svänga Ratt, Hjul Accelerera Pedaler, Motor Håll passagerare Personer
10 / 26 Projektplannering UML Vad är ett klassdiagram? Visuell representation av projektets design, Oberoende av programmeringsspråk, Standardiserat sätt att kommunicera idéer på, Innehåller; Alla klasser, Vilka medlemmar varje klass har, Vilka relationer som finns mellan klasserna
11 / 26 Projektplannering Klassdiagram - klasser Hur representeras en klass? - hours : int - minutes : int Display + sethours(hours : int) : void + setminutes(minutes : int) : void + public # protected - private
12 / 26 Projektplannering Klassdiagram Watch - time : int Button + ispressed() : bool Display - hours : int - minutes : int + sethours() : void + setminutes() : void Battery - charge : float + islow() : bool
13 / 26 Projektplannering Klassdiagram - relationer Olika typer av relationer mellan klasser: Arv arv mellan klasser B är en A Komposition delad livslängd A består av B mellan klasser Aggregation en klass refererar till A har en B en annan Association en klass använder sig av en annan A använder B
14 / 26 Projektplannering Klassdiagram - relationer A C E G 1 1 B 1..* D 0..* F H B är en A (arv) C består av minst en D (komposition) E har noll eller fler F (aggregation) G använder sig av H (association)
15 / 26 Projektplannering Mer om detta kommer på lektionen!
1 Projektkrav 2 Projektplannering 3 Spelutveckling
17 / 26 Spelutveckling Hur utvecklar man ett spel? Hittills har era labbar gått ut på att göra terminalbaserade program som utför en uppgift och sedan avslutar. Spel fungerar väldigt annorlunda från sådana program och kräver lite annat tänk. Ett spel måste göra 3 saker upprepade gånger; Hantera mus och tangentbord Uppdatera all logik i spelet Rita ut alla objekt på skärmen
18 / 26 Spelutveckling Main-loop För att utföra dessa operationer gör vi en loop: int main () { while (running) { handle_input (); update_logic (); render (); throttle (); } } Mer om hur dessa funktioner kan tänkas fungera på nästa föreläsning.
19 / 26 Spelutveckling Hur kan vi byta mellan olika tillstånd? Den enklaste metoden: int main () { int state = 0; while (running) { if ( state == 0) handle_menu (); else if ( state == 1) handle_game (); else if ( state == 2) handle_pause (); else running = false; throttle (); } } Detta går att göra mycket bättre...
20 / 26 Spelutveckling Ett mer skalbart alternativ State Tillståndsmaskin Main-loop Menu + handle () : void + update () : void + render () : void Game Pause MenuState GameState PauseState + handle () : void + update () : void + render () : void + handle () : void + update () : void + render () : void + handle () : void + update () : void + render () : void
21 / 26 Spelutveckling En tillståndsmaskin Hur används den? int main () { State * state; while (running) { state ->handle (); state ->update (); state ->render (); throttle (); } } int main () { } while (running) { handle_input (); update_logic (); render (); throttle (); } Detta är väldigt likt hur det såg ut från början!
22 / 26 Spelutveckling Men hur byter man tillstånd? Det finns många sätt. Gör det som passar ert projekt bäst! Exempel finns här: https://gitlab.ida.liu.se/tddi82/game_skeleton.git
23 / 26 Spelutveckling Resurshantering Spel består ofta av externa resurser t.ex. bilder och ljud, dessa resurser finns sparade på hårddisken, för att kunna använda dem måste vi ladda in resurserna i RAM-minnet, vi vill undvika att ladda in samma fil flera gånger.
24 / 26 Spelutveckling Resurshantering template <typename T> class Manager { static map <string, T> resources; public: static T& load( string const& file) { auto it { resources. find( file) }; if (it == end( resources)) { T res { load_from_file <T>( file)}; it = resources. insert( res). first; } return *(it->second); } };
25 / 26 Spelutveckling Resurshantering Med resurshanteraren: Image& im1 { Manager <Image >:: load(" fil. png") }; Image& im2 { Manager <Image >:: load(" fil. png") }; Manuell hantering: Image im1 { load_from_file <Image >(" fil. png") }; Image im2 { load_from_file <Image >(" fil. png") };
26 / 26 Spelutveckling Kollisionshantering Problem att lösa: Vad innebär det att två objekt har kolliderat? Hur detekterar vi kollisioner mellan alla objekt? Kan vi generalisera kollisionshanteringen?
www.liu.se