Programmera spel i C++ för nybörjare/Fog of War

Från Wikibooks


"Fog of War" är ett sätt att gömma spelplanen för spelarna. Den del av spelet som man inte vandrat omkring på ännu göms på olika sätt.

Exempel på hur "Fog of War" kan åstadkommas i spel (Battle for Wesnoth)
Ljusa rutor kan man se, mörka rutor har man sett men ser inte just nu, svarta rutor har aldrig setts (Free Civ)


Om bakgrunden består av en enda bild[redigera]

Ett grafikkortsintensivt sätt är att ändra hela skärmen så att allt man inte kan se tunnas ut och blir allt svartare ju längre bort från sin egen spelare man kommer. När spelaren rör sig, så rör sig samtidigt den punkt man kan se och man får en överblick över spelplanen som är lika stor som spelpjäsen kan se, resten blir svart. Det här sättet är grafikkortskrävande och det fungerar inte speciellt bra på äldre datorer, antagligen inte på mobiler heller.


Ett annat, äldre sätt att skapa en ”Fog of War” effekt är naturligtvis att täcka den del av spelplanen som spelaren inte sett ännu med fyrkantiga svarta bilder. Men en snyggare, likvärdig metod, är att täcka spelplanen med sprites i form av grå moln. De ritas bara ut om spelaren inte kan se det området. Den terräng som finns kring spelpjäsen kan ju ses och runt den ritas inga moln upp. Det här är det i särklass enklaste sättet att skapa en ”Fog of War effekt”. Ju mindre moln, desto mer naturlig ser dimman ut men ju mer ansträngande blir det för processorn att rita ut alla dimmoln-sprites. Nackdelen med den här metoden är att man kommer i ett dilemma när spelpjäsen rör på sig:

  • 1: Om spelpjäsen rör på sig och man återgår till att rita ut moln på de områden spelpjäsen varit på kan man gå vilse. Det kan kanske vara bra i ett "Rödluvan och vargen" spel eller liknande, men vanligtvis vill man att den del av spelplanen man redan undersökt skall förbli synlig.
  • 2: Om man låter den del av spelplanen man redan undersökt förbli synlig, kommer problemet att man automatiskt upptäcker fiender som kommer in i området, även om det kan vara länge sedan man undersökt den plats fienden dyker upp på.


Skall man komma runt det här problemet måste man jobba med mer avancerad ”back buffer” teknik. Principerna är följande:

  • 1: Du måste skapa en kopia av din spelplan som har samma terräng, oftast gör man den mörkblå för att simulera att det är dold terräng.
  • 2: Du måste beräkna vilka punkter som du har sett på spelplanen och som inte är täckta av moln, men som befinner sig så långt från spelpjäsen att den inte kan ses just för tillfället.
  • 3: Därefter kopierar du lämpliga stycken, 16x16, 32x32 eller 64x64 bitar från back buffern till den riktiga spelplanen som ritas ut efter det att bakgrunden ritats ut men innan dimmolns-spritarna/bilderna ritas ut.


På det sättet kommer all terräng man ännu inte sett att täckas med moln. All terräng man sett, men gått förbi, att täckas av en mörkblå variant av terrängen som gömmer ev. fientliga spelpjäser och slutligen kan man se all terräng runt omkring sig.

Det är inte snyggt med raka kanter av blå bakgrund mot den vanliga bakgrunden, så det är viktigt att du justerar utritningen av "Fog of War"-moln så att alla raka kanter på de inkopierade mörkblå bilderna verkligen täcks av moln.

"Ficklampa"[redigera]

Ett annat, enklare sätt, att bara vissa terräng just där figuren går är att rita ut ganska små svarta fyrkanter över hela spelplanen som spelaren inte ser. Just över spelaren har man däremot en större bild, säg 5x5 av den storlek de svarta tilesen har. Skapa den som monokrom (enbart svart och vit) med ett vitt centrum som tonar ut mot de svarta kanterna, spara den i png-format och välj att den vita färgen är genomskinlig.

När sedan figuren går ritas inte de omkringliggande 5x5 svarta fyrkanterna ut, istället ritar man ut bilden med genomskinlig mitt och när spelaren rör på sig så rör man också på bilden som har genomskinkligt centrum. På det viset skapas en "ficklampseffekt" eller den effekt man har när t.ex. en helikopter lyser på någon på natten. Det är bara de 3x3 tiles:en precis över spelaren man inte ritar ut, den återstående kanten av en tilesbredd får överlapa de utritade tilesen, detta för att skapa en mjuk rörelse när den genomskinliga bilden rör sig med samma riktning och hastighet som spelpjäsen.

Vill man ha en riktig ficklampseffekt kan man skapa den genomskinliga ytan i form av en strutliknande kägla som roteras när spelaren roterar, men det är litet överkurs. Det borde däremot fungera bra i ett spel med skräcktema där man går på en nattsvart plats med bara en ficklampa att lysa upp omgivningen med.

Spelplan med tiles[redigera]

Om man däremot skall använda sig av Fog of War på ett mindre avancerat sätt är det enklast att tänka sig att man bygger upp spelplanen av enstaka bitar som passar in i varandra, sk. ”tiles”. Varje ”tile” är en egen class-instance som har en sprite och som innehåller sökvägen till sin egen grafikfil. Då kan den ha ett av tre olika lägen med tillhörande bild:

  • Har aldrig setts, en svart tile. Samma grafikbild kan användas för alla tiles.
  • Har setts en gång men spepjäsen har gått vidare, en tile som har en blå ton men som i övrigt är en direkt kopia av den riktiga tilen som spelaren gått på.
  • Spelpjäsen ser den just nu, en vanlig tile.

Sedan är det bara att avgöra vilket av dessa tre lägen som skall ritas ut. De två första ritas alltid sist av allt för att täcka det som händer under, medan den sista ritas ut innan man ritar ut spelpjäserna (av naturliga skäl).


Fading med tiles[redigera]

Sedan kommer problemet med kantighet. Om man gör som här ovan kommer samtliga ”tiles” att vara fyrkantiga vilket också innebär att det som syns eller döljs har exakt fyrkantiga ytor. Det fungerar bra till enkla spel som man t.ex. kör på mobiltelefoner, men till mer avancerade spel vill man ha någon form av dimma eller suddiga kanter som täcker de raka kanterna på ”tiles” brickorna.

Ett sätt är att använda png-filer som har delar av ytan genomskinliga. Istället för att ha en fyrkantig, helsvart bricka har man en bricka där halva brickan täcks av svart som sedan tonas ut mot kanten. Det finns åtta lägen; mot de raka kanterna eller mot något av de fyra hörnen. På det viset kan man få den svarta ytan att ha mjuka kanter. Man får bara passa in det så att den täcker kanterna på de blåaktiga (har setts någon gång) och de vanliga spelplans ”tilesen”. Dessa brickor med "fading" får utgöra gränsen mellan det som är svart och det som inte är svart.