Programmera spel i C++ för nybörjare/Uppbyggnad av ett program

Från Wikibooks
Hoppa till navigering Hoppa till sök


Det är lätt att man, när man kopierar kod melan olika projekt och sidor, hamnar fel i koden. Speciellt när man gör spel är det viktigt att tänka på att det bara kan finnas en spelloop och att det som hamnar inom spelloopen aktiveras drygt 60 ggr i sekunden. En enkel struktur för ett dataprogram eller spel ser ut så här:

INCLUDE
DEFINE
 
Klassdeklarationer
Funktionsdeklarationer
Globala variabler
CONST värden som inte kan ändras

MAIN startar

Alla lokala variabler

 Alla händelser

    Spelloop startar 
          Spelet
    Spelloop slutar

 (ev. Uppsnyggning vid avslut)

MAIN slutar

Funktionsbeskrivningar

Alla includefiler och definitioner måste ligga först. Klassdeklarationer behöver inte ligga först, men om de ligger sist är man aldrig säker på att klasserna fungerar i spelet. Likadant är det med funktionsdeklarationerna. Man kan definiera alla funktioner efter MAIN har avslutats, men det kan uppstå udda fel som är svåra att lösa. Globala variabler kan anses onda, men det är onekligen enkelt att ha dem med. En variabel som står som global variabel behöver inte anges i funktionsdeklarationerna, funktionerna hittar dem ändå.

Konstanta värden är bra att ha i vissa sammanhang. Ett typexempel är PI som man beräknar cirklars areor och omkrets med. Skall man beräkna PI först med hundratals decimaler tar det onödigt lång tid för programmet och eftersom PI aldrig ändras är det bäst att ha värdet som en konstant. Det kan skrivas på två olika sätt:

#define PI 3.14159 //Det gamla sättet som man helst skall undvika, kan lika gärna skrivas in i "define" överst. Inget ; -tecken i slutet.
const double PI = 3.14159; //C++ standardsätt att skriva det på och då har det ett ; -tecken i slutet

MAIN är egentligen en funktion. Det är därför variabler inuti MAIN inte automatiskt kan nås av andra funktioner utan att man tydligt anger dem. I början av MAIN anger man alla olika variabler som programmet skall använda. De måste definieras innan de används.

Därefter fyller man i händelser. I ett spel är det "input" som tangentnedtryckningar o.dyl.

Därefter kommer spelloopen. Inuti den händer själva spelet. Allt som rör sig på skärmen skall finnas med i loopen, allt från animationer till racerbilar och stridsvagnar MEN inget bakgrundsljud. Funktioner som skall vara igång hela spelet måste nämligen ligga utanför spelloopen, annars startas och avbryts de om och om igen 60 gånger i sekunden. Det är lätt att göra fel med detta. Man kan bara ha en enda spelloop i ett spel. Det är ett vanligt nybörjarfel när man kopierar och klistrar kod att man får med sig ännu en spellooop, men det är bara den första som kommer att fungera.

Bara för att det blir "game over" är det inte säkert att spelet är slut. Man kanske vill visa en splash screen eller ett meddelande, det visas efter spelloopens slut.

Efter MAIN ligger normalt sett alla funktionsbeskrivningar.


Avancerat

Så fort du börjar få mer kod att hantera lägger man normalt sett alla klassdeklarationern och funktionsdeklarationerna i ett separat dokument kallat ett "header" dokument och alla klassbeskrivningarna och funktionsbeskrivningarna i ett annat dokument som länkas till headerdokumentet. På det viset finns bara alla INCLUDE, DEFINE och det inom MAIN kvar i huvuddokumentet och koden blir renare och enklare att hantera. Fortfarande måste dock alla animationer och allt som rör i spelet ligga inom spelloopen. Om det istället sker inuti separata funktioner stannar spelet upp och du får hackiga spel, något som också är ett vanligt nybörjarfel.