Tyngdekraft i spil

Tyngdekraft er en vigtig del af rigtig mange spil, og i de fleste tilfælde kan det laves ud fra et simpelt sæt principper, som så kan udbygges for mere komplekse opførsler.

I dette skriv vil jeg først opridse den helt basale opsætning af tyngdekraft i spilverdener, og bagefter vil jeg fortælle om et par teknikker som kan bruges til at justere og personliggøre, hvordan du bruger tyngdekraft i dit spil.

God læsning inden du starter

Hvordan laver vi tyngdekraft

Om vi snakker GameMaker eller andre udviklingsværktøjer - 2D eller 3D - er grundprincipperne bag tyngdekraft i spil typisk de samme: En karakter eller genstand skal bevæge sig hurtigere og hurtigere nedad jo længere tid karakteren eller genstanden falder. Så for at give en karakter i vores spil tyngdekraft, skal vi holde styr på tre ting:

  1. Karakterens nuværende placering på Y-aksen. I GameMaker er dette den indbyggede variabel y, som altid bruges til at bestemme et objekts placering. I drag and drop kan y-variablen ændres med "Jump To Point" kodeblokken.

    Kodeblok der flytter et objekt 12 pixels op

  2. Karakterens nuværende, vertikale hastighed. Hvis man bruger GameMakers indbyggede variabler og bevægelsessystem, er dette hvad variablen vspeed sørger for. Man kan sætte denne med "Set Speed" kodeblokken.

    Kodeblok der sætter et objekts vertikale hastighed til -10

  3. Selve tyngdekraften, altså hvor meget der skal lægges til den vertikale hastighed hvert trin i spillet. Det kan GameMaker gøre med variablen gravity, hvis man bruger deres indbyggede variabler og bevægelsessystem. Man kan sætte gravity med "Set Gravity Force" kodeblokken.

    Kodeblok der sætter et objekts tyngdekraft til 1

Selvom GameMaker har indbyggede variabler, som ofte giver god mening at bruge, kan jeg godt lide ikke at bruge de indbyggede bevægelsessystemer, da vi ikke har så meget kontrol over dem. Så lad os i stedet sætte noget tyngdekraft op selv (men i bund og grund er det det samme, som GameMaker gør skjult i baggrunden, når man bruger gravity variablen). Det, vi gerne vil gøre, er i bund og grund følgende:

Læg din tyngdekraft til din vertikale hastighed, og læg så din vertikale hastighed til din placering.

Lav din egen tyngdekraft:

Først skal vi definere vores variabler. GameMakers indbyggede y-variabel kommer vi ikke udenom at bruge, men lad os definere vspd i stedet for GameMakers vspeed, og grav i stedet for GameMakers gravity. Dette skal gøres én gang, typisk i en Create-event.

Kodeblok der definerer vores vspd og grav variabler.

Vores variabler gør ikke noget i sig selv, men de er vigtige for at opnå vores mål. I en Step-event kan vi så få magien til at ske. Det gør vi ved først at tilføje vores grav til vores vspd (derfor skal "relative" være markeret i kodeblokken). Det er dette der gør, at vores karakter vil falde hurtigere og hurtigere, og ikke bare med en fast hastighed. Derefter skal vi så tilføje vores vspd til vores y for at flytte vores karakter.

Kodeblokker der tilføjer vores tyngdekraft til vores hastighed, og vores hastighed til vores placering

Og det er egentlig grundprincipperne bag tyngdekraft. Vores spiller vil nu falde hurtigere og hurtigere jo længere tid de er i luften. Et spil har selvfølgelig typisk noget, som stopper faldet. Det kan helt simpelt være en Y-placering, som stopper spilleren, ligesom jeg har skrevet om i dette indlæg (jeg bruger den teknik i mit "Flappy Bird"-inspirerede spil), eller måske oftere skal vi bruge et kollisionssystem ligesom i mit skriv Flyt en figur til den rammer en mur. Ofte vil man også begrænse karakterernes hastigheder, så de ikke bevæger sig alt for hurtigt.

Udvidelser til formularen - tips og tricks

Når først grundformularen er på plads, kan vi begynde at lave variationer af den, for at tilpasse den vores spils gameplay, eller tilføje til det. Der er mange teknikker, vi kan anvende, og følgende er kun et fåtal af måder, hvorpå vi kan tilpasse tyngdekraften i vores spil.

Adskilt tyngdekraft op og ned

I rigtig mange spil, er tyngdekraften konstant. Men vi kan få meget ud af at adskille tyngdekraften, så den er forskellig, alt efter om en karakter bevæger sig opad eller nedad.

Når vi får en spillerkarakter til at hoppe, er det ofte for at komme hurtigt opad, så det kan give god mening at give hoppet en stor kraft, som så kan modvirkes med en høj tyngdekraft, så karakteren ikke hopper for højt. Når karakteren så falder ned igen, kan det være fordelagtigt at skrue ned for tyngdekraften, så vi nemmere kan lande der, hvor vi gerne vil lande. En simpel form af sådan noget kode kunne se sådan her ud:

Kodeblokke der sætter tyngdekraft alt efter om karakteren bevæger sig opad eller nedad

Skiftende tyngdekraft

Lidt i samme stil som den adskilte tyngdekraft, kan vi også bruge forskellige tyngdekræfter som et element i vores spil. Det er gjort mange gange før og kan gøres på et utal af måder. Her er et par eksempler fra forskellige spil.

Faldskærm

Mange spil bruger parasoller, faldskærme, eller simpelthen oppustethed til at lade spilleren falde meget langsom. Her er et billede af det lidt gamle spil Tombi!, et af mine yndlingsspil, hvor man har mulighed for at tage en "funky parasol" på, netop til det formål:

Skærmbillede fra spillet Tombi, hvor spilleren bruger en parasol til at falde langsommere

Ligesom jeg beskrev med den adskilte tyngdekraft, kan den her slags mekanismer hjælpe spilleren med at have mere kontrol når de hopper fra platform til platform. Men man kan også gøre det til en ulempe i visse situationer. For eksempel har Tombi! nogle vindfyldte baner, hvor man bliver blæst hurtigere væk, hvis man har parasollen på.

Vend det hele på hovedet ...

... eller mod venstre, eller højre. En god håndfuld spil tillader spilleren af "flippe" eller rotere tyngdekraften. Senest har jeg set det blive gjort i Crash Bandicoot 4, hvor man gør det i bestemte sektioner af spillet, ved at bruge en magisk maske:

Billede af Crash Bandicoot der løber på loftet

Der kan være mange måder at gøre det på. Det kan være spillerens egen tyngdekraft der vendes på hovedet, som i Crash Bandicoot - men det kan også være hele verdens tyngdekraft, eller fjendernes.

Første trin for dette, er selvfølgelig at vende tyngdekraften om, hvilket vi nemt kan gøre ved at sætte grav til et negativt tal. Men man skal også huske på ting, som at sørge for at kollisioner med loftet stadig virker, at vende spillerkarakteren grafik på hovedet, og at karakterens hop også lige pludselig skal gå den modsatte vej.

Noget der fører dig opad eller nedad

Vind eller andre kræfter kan også bruges til at variere tyngdekraften. I Rayman Origins og Rayman Legends bruges opad- og nedadgående vind for eksempel til at skrue op eller ned for tyngdekraften:

Skærmbillede fra Rayman hvor han svæver mellem vind

Når Rayman hopper i en opadgående vind, kan han hoppe højere end normalt. Modsat hopper han ikke særlig højt, når vinden går nedad. I skærmbilledet bruger Rayman også sit hår som en propel, hvilket fungerer meget ligesom parasollen i Tombi: Rayman falder meget langsommere, når han gør dette, og kan endda svæve ind i opadgående vind for at flyve opad.

Husk dog altid at gøre det tydeligt, hvad der ændrer på tyngdekraften. Læg mærke til at vinden i Rayman nærmest ikke er til at overse, fordi den er så tydeliggjort, både i dens opstregninger og partikeleffekter.

Coyote time

Når en spiller skal hoppe henover et stort hul, kan de nemt føle sig snydt, hvis de lige præcis ikke når at hoppe i tide, og derfor falder i hullet - for ofte vil de føle, at de faktisk hoppede i tide. Derfor gør langt de fleste platformer spil det, at de tillader spilleren at hoppe et lille stykke ude i luften, for at give spilleren en ekstra chance. I samme vending, kan det give mening at vente et splitsekund med at slå tyngdekraften til, når en spiller løber udover en kant. "Coyote time" er opkaldt efter Looney Toons "Wile E. Coyote", prærieulven der altid løber efter Hjulben, og nogle gange bliver snydt til at løbe udover en klippe, hvor han så hænger lidt i luften, før han falder.

Et billede af Wile E. Coyote som hænger i luften inden han falder

Jeg ynder at lave coyote time i mine spil, men i mit game jam spil Sam & Daisy Go Hide & Seek nåede jeg det for eksempel ikke, hvilket gjorde at en del af dem der spillede det, havde svært ved at klare nogle af hoppene i spillet.

Og mens vi er ved Looney Toons ...

Gif med Looney Toons "That's all folks'

God læsning, når du er færdig


Published