Mål
- Få en grundläggande arkitektur
- Spela upp ljudeffekter
- Hantera indata
Teori
MVC, Model View Controller
MVC är en mjukvaruarkitektur. En MVC-arkitektur hjälper programmeraren att dela upp kodens ansvar i olika komponenter. Det finns tre grundläggande komponenter de är:
Model. Spellogik och regler. Vad kan hända?
Spelets modell samlar spelets regler på en plats. Här samlar vi de objekt som påverkar spelet? Vilken är deras logiska position och andra egenskaper som exempelvis hitpoints, hastighet och förmågor.
Här samlar vi också de regler som styr spelet som exempelvis fysik och AI och andra basala regler som när är spelet slut och vem vann?
I första laborationen är bollens position och hastighet samt reglerna för hur den studsar delar av modellen.
//Regel om fienden kolliderar med spelaren dör spelaren for (int i = 0; i < MaxEnemies; i++) { if (m_enemy[i].isColliding(m_player)) { m_player.setDead(); } }
View. Rendering och ljud. Vad kan vi se och höra?
Vyns uppgift är att presentera det som sker för användaren. Det vill säga vyn renderar modellen på skärmen. Som i laboration 1 är de transformationsfunktioner vi skrivit en del av vyn.
Vyn samlar också sådant som bara är visuellt som utritning av bakgrunder, effekter som Ljudeffekter och partikeleffekter är också en del av vyn.
Vyn spelar också upp bakgrundsljud som musik.
Eftersom vyn använder bilder, modeller och ljud så brukar den också ladda in dem.
//Rita ut alla fiender underst for (int i = 0; i < a_game.MaxEnemies; i++) { DrawEnemy(a_game.m_enemy[i]); } //Rita ut spelaren ovanpå DrawPlayer(a_game.m_player.m_pos);
Controller. Interaktion. Vad kan vi göra?
Kontrollern reagerar på indata som exempelvis musrörelser och ändrar i modellen beroende på indata. Kontrollern väljer och använder vyer för att kunna utföra sin uppgift.
//Interaktion. Vad kan vi göra if (gamepad.IsClicked() == true) { a_game.FireWeapon(); } m_gameView.Draw(a_game);
Komponenternas relationer
För att minska antalet relationer så brukar man begränsa hur klasser i de olika komponenterna får interagera. Ta en titt på följande bild:
Pilarnas riktning visar hur de olika klassernas relationer får bildas.
En klass i Controller får använda både klasser i modellen och i vyn medan en klass i vyn får använda klasser i modellen men inte i controllern. En klass i modellen får inte använda vare sig vyn eller controllern.
Effekter
- Lättare att hitta i koden.
- Lättare att återanvända kod eftersom vi samlar liknande kod i komponenterna
- Bättre code-Cohesion
Uppgift 1. Dela upp koden i namespaces
Dela upp koden ifrån laboration 1 och 2 genom att placer klasserna i namnrymder. Vi har ännu ingen interaktion och därför har vi inte mycket kod i vår MasterController. Som stöd finns här en bild av hur man skulle kunna dela upp klasserna från laborationerna i namnrymderna Model, View och Controller. Kameran hamnar nu alltså i namnrymden View.Camera
Uppgift 2. Interagera och spela upp ljud
Målet med uppgiften är att interagera med simuleringen och spela upp en partikeleffekt och en ljudeffekt på platsen för interaktionen. Vi skapar för ändamålet en ny klass GameController som får uppdraget att hantera indata och sedan be lämplig vy att visualisera och spela upp ljud.
Uppgift 3. Ett minimalt spel
Öka antal bollar till 10 i laborationsuppgift 1. Vid klick i spelarean med musen skall en explosionsljudeffekt spelas upp och de bollar som är inom en liten area från musklicket skall försvinna.
Camera-klassen kommer nu behöva en ny metod för att översätta från vy-koordinater tillbaka till logiska koordinater. Reglerna som avgör vilka bollar som har träffats placerar vi i Modellen.