Lager båtspill med Finn-Erik (5): «Mye jobb for pappa»
– Nesten umulig å holde tritt med kravspesifikasjonen fra den fem år gamle kunden, avslører Torbjørn Kristoffersen.
Sønnen min Finn-Erik er fem år og veldig interessert i båter. Vi bor i Sør-Afrika, men han er likevel veldig opptatt av skip, fiskebåter og steder langs den norske kysten. MarineTraffic har en del av skylden, tror jeg.
For å illustrere dette: Hin dagen sendte farmor et bilde av passasjerskipet Borealis utenfor Klokkarvik på Sotra. Jeg viste det til Finn-Erik og sa:
«Her er et skip som farmor sendte, hun sier skipet er fra Tyskland»
«Nei! Ikkje tysk. Han har Bahamas-flagg, pappa!» skrek han tilbake.
«Såpass» båtinteressert, med andre ord.
Så jeg tenkte at jeg burde lage et lite dataspill til ham. Jeg er jo tross alt programmerer av yrke (men riktignok ikke spillutvikler).
LÖVE2D og Lua
Jeg hadde egentlig tenkt å holde det ganske enkelt. Spillet skulle bare kjøre på iMac-en vi har i stuen, og være noe han kunne spille når han ville putre litt rundt med en båt.
Jeg brukte LÖVE2D og programmeringsspråket Lua, som er rimelig enkelt å komme i gang med. I motsetning til en komplett spillmotor, er LÖVE et relativt tynt rammeverk. Den gir deg et lerret, en game-løkke, og tilgang til grafikk, lyd og styring.
Det tok ikke lang tid før Finn-Erik begynte å komme med idéer. Det viste seg å bli utrolig gøy, og ikke minst ganske mye jobb for pappa.
«Vi trenger den båten! Pappa må klippe!»
«Og den havnen. Og havnemesteren skal være farfar.»
Jaggu ikke lett å si nei... Det ballet på seg og «Båtspillet» ble til.
Hovedbåten i spillet laget han selv. Den er faktisk en ekte isoporbåt som står på rommet hans.
Spillkunstner Finn-Erik (5)
Jeg hadde egentlig tenkt å lage grafikken selv, men Finn-Erik begynte så å tegne båter og helikoptre som han ville ha med.
Hovedbåten i spillet laget han selv. Den er faktisk en ekte isoporbåt som står på rommet hans.
Ellers er det noen tegninger vi har skannet inn, og diverse andre gratis assets som jeg kjørte gjennom Gimp og Blender.
Lydene er noe av det artigste for meg. Barnestemmen i spillet er faktisk hans egen. Finn-Erik har vært involvert i nesten hver eneste beslutning.
Så begynte det å hakke
Med kartet tenkte jeg at prosedural generering kunne være løsningen. Dermed brukte jeg altfor mange kvelder på å lage et system som kunne gjøre jobben lettere.
Kartet genereres nå med støyfunksjoner og forskjellige masker som former øyene. Høyden i terrenget bestemmer om du får vann, gress, stein eller snø. Oki, dette var riktignok langt mer arbeid enn å bare tegne noen øyer.
Spillet kjørte silkemykt med 120 bilder per sekund (FPS). Alt gikk som smurt, helt til det begynte å hakke.
Etter litt profilering og logging fant jeg ut at problemet var GC, altså garbage collection, i Lua:
- Jeg hadde skrevet spillmotoren på en litt naiv måte og opprettet masse midlertidige objekter for hver frame. Spillet brukte enormt masse tid på å lage ting det egentlig ikke trengte. I LÖVE2D og Lua skjer jo alt inni én enkel spill-løkke.
- Jeg flyttet derfor mer av logikken og oppbygging av objekter til når kartet lastes inn, altså før selve spillingen begynner.
Det fungerte bra helt til innlastingsskjermen begynte å henge.
Det viste seg at jeg nå gjorde så mye «arbeid» under innlastingen at spillet fryste mens kartet ble bygget. Tingen var at jeg viste en animert innlastingsskjerm mens jeg drev oppbygging av objekter.
Men det viste seg riktignok at dette er greit hvis man gjør det med coroutines (som jeg har brukt i andre språk, men jeg visste faktisk ikke at Lua og LÖVE støttet dette).
Ut i verden
Så ble det plutselig snakk om distribusjon. Planen var jo i utgangspunktet at det skulle bli et lite spill til hjemmebruk.
Men Finn-Erik fortsatte å komme med ideer, og spillet ble etter hvert større enn jeg hadde tenkt.
Da tenkte jeg det kunne være morsomt å sende det til venner og familie med små barn, særlig til min bror Arne som har to jenter (Solveig og Frida, som forøvrig har blitt havnesjefer i spillet). De har iPad, så da måtte jeg jo få det inn på App Store!
Så båtspillet finnes på App Store (iPhone, iPad, macOS).
Til dere som lurer om Android - hvis det er nok interesse så vil jeg gjerne laste opp i Play Store. LÖVE funker helt fint der og, samt Windows.
Veien videre
Finn-Erik har på ingen måte gått tom for idéer, f.eks sjørøvere og skattekart. Det er kanskje det som har vært det morsomste med hele prosjektet - dette far/sønn samarbeidet.
Tilbake til det tekniske: Som sagt brukte jeg Lua og skrev alt for hånd de første par ukene. Etter hvert som spillet vokste, begynte jeg å bruke mer og mer Claude Code.
Det er nesten umulig å holde tritt med kravspesifikasjonen fra den fem år gamle kunden ellers.
Språkmodeller er særlig nyttige når jeg står fast med algoritmer og mattte. Opus foreslo f.eks å bruke Brownsk støy til å generere terrenget.
Av andre verktøy bruker jeg CLion, vim, Gimp, Blender, Xcode, og noen byggeskript i bash. Alt er åpen kildekode og tilgjengelig på github, inkludert noen åpne game-assets jeg fant (OpenGFX). Til lydopptak brukte jeg Voice Memos på iPhone.
Det er bare å prøve spillet. Jeg setter stor pris på tilbakemeldinger!
Foretrekk oss i Google Discover
Ved å legge oss til som foretrukket kilde i Google vil du blant annet få opp flere av sakene våre i Google Discover. Tusen takk for støtten!