Introduksjon
Nå tenker jeg det er på tide med en ny devlog, da jeg igjen sitter med det jeg kaller en prototype med en del forbedringer siden forrige gang. Fokuset denne gangen har ligget på planlegging av struktur, inventory-mekanikker, samt et grafisk løft. Prototype 2 som kan sees lengre ned i artikkelen gir et visuelt inntrykk over hva som er gjort hittil, og hva som kommer til å bli overført til neste prosjekt.
Struktur
Siden scriptene i Godot har begynt å bli alt for lange, og det er alt for mange scripts på nodes med referanser til andre nodes som ikke hører til der, har det blitt vanskelig å finne fram og rette opp i feil. Et fenomen som på fagspråket kalles spaghetti. Men det var egentlig forventet da målet har vært å få til noe som fungerer. Derfor skal jeg i neste omgang reorganisere hele scene-treet.
Dette innebærer blant annet å legge til flere global scripts som gjør forskjellige ting (f.eks "save_manager", "inventory_manager" osv.), samle alle UI-nodes under én CanvasLayer, og benytte groups for alt det er verdt. Dermed vil scripts hovedsakelig kjøre kode som hører til under sin spesifikke node, slik at jeg slipper å rote gjennom mengder med references. Det vil også redusere sjansen for at noe blir ødelagt senere i utviklingen.
Et lite utdrag fra det planlagte scene-treet:
Inventory
Hva er vel et pek-og-klikk-spill uten inventory? Det er en av de fundamentale mekanikkene som må på plass, så det har jeg jobbet litt med. Tanken er å ha items spredt rundt i sine respektive levels, og at karakteren kan plukke opp en item slik at den forsvinner fra level-scenen og havner i inventory-UIen. For å sikre skalerbarhet og reusability har jeg laget en template-scene for "Item", som jeg kan instance i forskjellige levels. Denne kan jeg endre properties på slik som sprite, navn, tooltip osv, slik at hver item blir unik.
Etter dagesvis med prøving og feiling fikk jeg til en pipeline som fungerer som ønsket. Spilleren plukker opp en item fra level -> item forsvinner fra level og blir plassert i inventory -> items har drag & drop-funksjon inne i inventory. Det som gjenstår er å få right-click-menyen til å fungere i inventory, og deretter bruke hver item på hverandre (combine) eller på forskjellige hotspots i levelen.
Animasjon
En hel del tid har gått med til å lære å animere karakterer i Blender. Personlig synes jeg læringskurven er mye brattere i Blender enn den har vært i Godot. Det kommer nok av at jeg ikke oppfatter menyene som logisk plassert, og har strevet mye med å lære meg når jeg skal inn i de forskjellige modusene, "Object mode", "Edit mode" og "Pose mode". I tillegg måtte jeg lære meg hotkeys, layering, materials og modifiers, forskjellen på GP objects og andre objects og hvordan de oppfører seg, samt onion skinning og keyframes.
Mesteparten av tiden med Blender har blitt brukt til forsøk med armature/skeleton, vertex groups og lattices for å få til bendy bones, men her føler jeg at ting blir unødvendig komplisert. Dessuten får jeg ikke ønsket grad av kontroll over resultatet, som vist i prototype 2 under. Jeg tror nok skeletons er bedre egnet til 3D-animasjoner. Derfor har jeg videre herfra bestemt meg for å droppe skeleton, og gå over til vanlig 2D-animering med key poses og inbetweens. Dette krever mer manuell tegning og finpuss, men til gjengjeld gir det full kontroll, og animasjonsprosessen blir mindre komplisert.
Før:
Etter:
Det er ingen tvil om at det finnes svært mange gode animatører der ute, derav ingressen. Dermed føles det nesten som en uoverkommelig oppgave å kunne måle seg med noen av disse for en nybegynner. Men jeg er alt for sta til å gi opp, og pusler videre gjennom jungelen av tutorials i håp om at Blender skal gi meg eureka-øyeblikket som jeg søker.
Prototype 2
Oppsummering
Det er utrolig tilfredsstillende å kunne bygge opp denne forbedrede prototypen på bare noen uker, sammenlignet med prototype 1 som tok et års tid. Jeg kan vel våge meg å si at jeg er positivt overrasket over egne ferdigheter hittil. AI har riktignok vært til god hjelp med å finne kode som passer til mekanikkene jeg ønsker, selv om den ikke alltid er like pålitelig. Movement indicator blir forresten droppet heretter da jeg føler den mekanikken ikke passer inn i et 2D-adventure-spill.
Siden forrige gang har jeg fått til:
- Et robust movement script som tar høyde for avstander til items, collisions og forbedret navigation pathing.
- En enkel og brukervennlig UI/UX som pauser resten av spillet når en meny er åpen.
- Fungerende mekanikker for saving/loading, level transitions, pickup items til inventory og custom tooltips med mer.
Til neste gang
Neste devlog kommer nok til å ta litt lengre tid å publisere enn denne, da jeg allerede nå ser konturene av hvor omfattende et arbeid jeg står ovenfor.
Jeg skal:
- Gjennomføre planen jeg har lagt for strukturering av main scenetree.
- Animere karakterer på normalt vis. Idle, walk, pickup osv.
- Finpusse inventory-mekanikkene.
- Innføre et dialog-system til spillet.
Å sette opp et nytt prosjekt med ny og forbedret struktur er ikke den største utfordringen. Animasjon kommer nok til å ta brorparten av tiden, da jeg fortsatt trenger en del teori for å få på plass en god workflow. Planen er også å få til et fullverdig inventory-system med items som kan brukes i spillet, eksempelvis "Use Old key on Door" -> "Door unlocked". Når det gjelder dialoger så har jeg tenkt å benytte Dialogue Manager, en lightweight plugin for Godot som er veldig fleksibel. Detta blir spennende!
Følg prosjektet: