Spillutvikling med Godot đŸ€–

Skip to content

Hvor kommer denne informasjonen fra?

Mye av dette er bare en gjenfortelling av Godot’s offisielle dokumentasjon. Under finner dere noen nyttige lenker til den offisielle dokumentasjonen (som jeg helst anbefaler over denne pĂ„ Piggy, men hvis du foretrekker denne er det bare Ă„ bruke denne!)

Nyttige ressurser:

Hva med grafikk, mÄ jeg lage den selv?

Nei! Dere kan finne mye free assets her:

Andre nyttige lenker:

Andre game engines?

Hvis du fortrekker kan du bruke andre game engines. Eksempler pÄ andre game engines er:

Det finnes mange andre ogsÄ, sÞk gjerne hvis du vil prÞve noe annet!

Hva er Godot?

Godot (Utalles Guh-doh), er en ‘Game Engine’. For Ă„ si det enkelt er det et program som lar deg lage spill (eller vanlige programmer hvis du vil). Godot kan gjĂžre det aller meste andre game-engines kan gjĂžre, bĂ„de 2D og 3D.

Eksempler pÄ spill laget i Godot: Godot Showcase

Det er ikke bare Indie games som har blitt laget i Godot, Sonic Colors Ultimate er laget med Godot! 🩔🩔🩔

Hvordan fÄr du tak i Godot?

Du kan enten laste ned Godot fra:

Bare last ned og installer (eller kjÞr pÄ steam).

Sett opp et prosjekt!

NÄr du starter Godot fÄr du opp dette vinduet:

Godot Prosjekt

Her blir du spurt om programmeringssprÄk, GDScript eller C#. GDScript er veldig likt Python.

Forskjeller mellom GDScript og Python (uten farger):

def hello():
    text = "Hello world!"

    print(text)
func hello():
    var text = "Hello world!"

    print(text)

For variabler i Python trenger du bare Ä skrive navnet pÄ variabelen. I GDScript mÄ du skrive var fÞrst. For Ä lage funksjoner skriver du func i stedet for def.

Scenes & Nodes

Et av de viktigste konseptene innen Godot er Scenes og Nodes. Vi kan begynne med noder. En node er et objekt i godot, og det kan forestille alt. Det kan vÊre noe some forestiller en spiller, en fiende, en knapp i en meny, tekst pÄ skjermen, alt mulig. Scener er en samling av noder.

Her skal vi lage et veldig enkelt eksempel.

Del 1a - Sett opp “player”-scenen

PĂ„ toppen av Godot vinduet, trykk “2D” knappen for Ă„ endre viewet til et 2D view.

PĂ„ venstre side av vinduet ser dere fĂžlgende grensesnitt:

Create Scene

Trykk “Other Node” knappen, og sĂžk pĂ„ “CharacterBody2D”, velg den og trykk “Create”. Dette er en node som brukes for en 2D spiller. Dere ser kanskje at det er en varseltrekant ⚠ ved siden av “CharacterBody2D” noden. Dette er fordi den mangler noen ting den gjerne vil ha.

Hvis du hĂžyre-klikker pĂ„ noden er den en “+ Add Child Node
” knapp. Bruk denne og legg til to noder, Sprite2D og CollisionShape2D. Sprite2D brukes til Ă„ legge til noe grafikk pĂ„ spilleren, mens den andre brukes til Ă„ sjekke for kollisjoner. Du kan ogsĂ„ gi dem navn hvis det gjĂžr det lettere Ă„ holde styr pĂ„ ting. Jeg har gitt min CharacterBody2D navnet “Player”. Slik bĂžr scenen se ut nĂ„:

Scene currently

Del 1b - Fikse ⚠ pĂ„ CollisionShape2D

Varseltrekanten i dette tilfellet er at at CollisionShape2D mangler faktisk kollisjon. Dette kan du fikse ved Ă„ tyrkke pĂ„ noden (til venstre), sĂ„ kommer det opp et panel pĂ„ hĂžyre side. Her fĂ„r du en haug med informasjon om noden du kan endre pĂ„. Gjerne lek rundt med det som er der. Men den vi vil fokusere pĂ„ er “Shape”, sett denne til for eksempel RectangleShape2D. Det er ikke sĂ„ veldig viktig, vi skal ikke bruke kollisjonene her.

Del 1c - Legge til en Sprite, grafikk

Hvis du trykker pĂ„ Sprite2D til venstre, fĂ„r du opp feltet til hĂžyre, der det stĂ„r “Texture”. Her kan du putte inn et bilde til spilleren. Er bare Ă„ dra inn et bilde Ă„ slippe det i feltet.

Slik vil det se ut etter Ă„ ha lagt til en sprite.

Sprite menu

Del 2 - Legge til input, kontroller

PĂ„ toppen av vinduet er det en meny, “Scene - Project - Debug - Editor - Help”. Trykk pĂ„ “Project” og deretter “Project Settings”. Her fĂ„r du opp en meny med masse instillinger. Trykk pĂ„ “Input Map”. Her kan dere sett opp knapper pĂ„ tastaturet.

  • I “Add New Action” feltet, skriv “left” ogsĂ„ trykk “Add”.
  • Legg deretter til “right”, “up” og “down”.
  • Disse blir kjent som “Actions”
  • PĂ„ hver “Action” kan dere legge inn knapper med Ă„ trykke pĂ„ + knappen til hĂžyre.

Plus button

  • Her er det bare Ă„ trykke pĂ„ tastaturet, sĂ„ trykke Add.
  • Legg til knapper pĂ„ alle actions.

Del 3 - Legge til et script for Ă„ styre spilleren.

For Ä kunne legge til spill-logikk, altsÄ gjÞre noe med spilleren, bakgrunnen, eller hva enn det skulle vÊre i spillet, trenger vi et script. Scripts er kode, og kan skrives i to sprÄk, GDScript eller C#, GDScript er default.

  • Trykk pĂ„ “CharacterBody2D” (jeg har kalt den “Player”) noden.
  • Trykk pĂ„ “Attach Script” knappen (se under)

Attach script button

  • Her fĂ„r dere opp et vindu hvor dere kan velge sprĂ„k (velg GDScript) og en path (bare la den hete det som stĂ„r der, men dere kan gi den navn), ogsĂ„ trykk videre. Her fĂ„r dere opp et “Script”-vindu. Det stĂ„r ikke mye her til Ă„ begynne med.
extends CharacterBody2D

Det eneste denne koden sier for Ăžyeblikket er at koden skal tilhĂžre en node av typen “CharacterBody2D”, som er spilleren vĂ„r.

Vi skal legge til en funksjon her som vi skal bruke til Ă„ manipulere spilleren:

extends CharacterBody2D

func _physics_process(delta: float) -> void:
    return

Physics Process?

_physics_process er en funksjon som oppdateres hver eneste “frame”, altsĂ„ rundt 60 ganger i sekundet (default). Det finnes en annen funksjon som bare heter _process, som oppdateres hele veien. Hvis du vil ha at spilleren beveger seg i et jevnt tempo, bruker du _physics_process.

Det er her vi skal legge til kode som flytter spilleren.

Del 4 - Basic input

I del 2 la du til input-knapper, nĂ„ skal vi bruke dem. Det finnes et innebygd objekt som heter Input som vi kan bruke til Ă„ sjekke om spilleren har trykket pĂ„ det som vi har satt opp i “Input Map”.

PrĂžv Ă„ legg denne koden inn i _physics_process koden:

if Input.is_action_pressed('right'):
    velocity.x = 100

move_and_slide()

Hva er move_and_slide()?

move_and_slide() er en innebygd funksjon i Godot som brukes nÄr vi vil faktisk flytte det vi bruker det pÄ. Uten denne vil ikke spilleren flytte seg.

Warning

Mellomrommet pÄ linjene er veldig viktig, dette er likt som i Python.

Hva skjer nĂ„r du starter programmet med Ă„ trykke pĂ„ play-knappen i Godot vinduet, sĂ„ trykke “right”?

Hvis ingenting skjer nÄ:

  • Har du husket Ă„ sette opp noe i “Input Map”?
  • Har du skrevet right og ikke Right? AltsĂ„, er det du skrev i koden det samme som navnet i input map?
Hele koden sÄ langt
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100

    move_and_slide()

PrÞv nÄ Ä legge til kode for 'left', 'up', 'down'.

Hva mÄ velocity.x vÊre for left? Hva med up og down?

Hele koden nÄ
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

Del 5 - Fikse pÄ koden

Dere legger kanskje merke til at spilleren ikke stopper nÄr du slipper en retning. Det kan vi fikse pÄ nÄ!

FĂžr alle if-ene, legg til en linje som setter velocity til 0. Det kan du gjĂžre med Ă„ skrive velocity = Vector2()

Alle farter og retninger i Godot er vektorer, dette er et matte-konsept vi ikke skal gÄ inn pÄ nÄ, men hvis du lurer mer pÄ hva dette betyr, kan dere gÄ hit: Wikipedia vectors.

Hele koden nÄ
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    velovity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

NÄr du starter spillet nÄ kan du flytte rundt pÄ spilleren:

Videre kan dere fikse pÄ koden til Ä gjÞre at farten ikke bare er et tall, men kan lagres et annet sted.

Du kan for eksempel (fÞr funksjonen) legge til en konstant som holder styr pÄ farten.

Hele koden til slutt med const
extends CharacterBody2D

const SPEED = 100

func _physics_process(delta: float) -> void:
    velovity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = SPEED
    if Input.is_action_pressed('left'):
        velocity.x = -SPEED
    if Input.is_action_pressed('down'):
        velocity.y = SPEED
    if Input.is_action_pressed('up'):
        velocity.y = -SPEED

    move_and_slide()

Del 6 - Lek rundt selv!

Hvis dere gÄr tilbake til den fÞrste delen, Nyttige Ressurser, kan dere finne hva dere kan fortsette Ä leke med.

Etter dette kan dere prÞve Ä lage deres eget spill. Hva dere lager er opp til dere! Om du vil lage noe helt nytt, gjÞr det! Hvis dere vil prÞve Ä etterligne et spill som allerede eksisterer, gjÞr det! Beste mÄten Ä lÊre pÄ er Ä prÞve!