Speleutvikling med Godot đŸ€–

Skip to content

Dette er ei maskinĂžversatt tekst som kann inniholda feil!

Kvar kjem denne informasjonen frÄ?

Mykje av dette er berre ei gjenfortaling av Godot sin offisielle dokumentasjon. Under finn de nokre nyttige lenker til den offisielle dokumentasjonen (som eg helst tilrÄr over denne pÄ Piggy, men om de foretrekkjer denne er det berre Ä bruke denne!)

Nyttige ressursar:

Kva med grafikk, mÄ eg laga den sjÞlv?

Nei! De kan finna mykje free assets her:

Andre nyttige lenker:

Andre spelmotorar?

Om du foretrekkjer kan du bruke andre spelmotorar. Eksempel pÄ andre spelmotorar er:

Det finnes mange andre ĂČg, sĂžk gjerne om du vil prĂžve noko anna!

Kva er Godot?

Godot (uttalast Guh-doh), er ei ‘Game Engine’. For Ă„ seia det enkelt er det eit program som let deg laga spel (eller vanlege program om du vil). Godot kan gjera det aller meste andre game-engines kan gjera, bĂ„de 2D og 3D.

Eksempel pÄ spel laga i Godot: Godot Showcase

Det er ikkje berre Indie games som er laga i Godot, Sonic Colors Ultimate er laga med Godot!

Korleis fÄr du tak i Godot?

Du kan enten lasta ned Godot frÄ:

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

Sett opp eit prosjekt!

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

Godot Prosjekt

Her vert du spurt om programmeringssprÄk, GDScript eller C#. GDScript er svÊrt lik Python.

Forskylar mellom GDScript og Python (utan fargar):

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

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

    print(text)

For variablar i Python treng du berre Ä skrive namnet pÄ variabelen. I GDScript mÄ du skrive var fyrst. For Ä lage funksjonar skriv du func istadenfor def.

Scener & Noder

Eit av dei viktigaste omgrepene innan Godot er Scener og Noder. Vi kan byrja med noder. Ei node er eit objekt i godot, og det kan representera alt. Det kan vera noko som representerer ein spelar, ein fiende, ei knapp i ei meny, tekst pÄ skjermen, alt mogleg. Scener er ei samling av noder.

Her skal vi laga eit veldig enkelt dĂžme.

Del 1a - Sett opp “player”-scenen

PĂ„ toppen av Godot vindauget, trykk “2D” knappen for Ă„ endre synsvinkelen til eit 2D syn.

PĂ„ venstre sida av vindauget ser de fĂžlgjande grensesnittet:

Create Scene

Trykk “Other Node” knappen, og sĂžk pĂ„ “CharacterBody2D”, vel den og trykk “Create”. Dette er ei node som vert brukt for ein 2D spelar. De ser kanskje at det er ei varseltriangel ⚠ ved sida av “CharacterBody2D” noden. Dette er fordi den manglar nokre ting den gjerne vil ha.

Om du hĂžgre-klikkar pĂ„ noden er det ei “+ Add Child Node
” knapp. Bruk denne og legg til to nodar, Sprite2D og CollisionShape2D. Sprite2D vert brukt til Ă„ leggje til noko grafikk pĂ„ spelaren, medan den andre vert brukt til Ă„ sjekke for kollisjonar. Du kan ogsĂ„ gje dei namn om det gjer det lettare Ă„ halde oversyn over ting. Eg har gjeve min CharacterBody2D namnet “Player”. Slik bĂžr scena sjĂ„ ut no:

Scene currently

Del 1b - Fikse ⚠ pĂ„ CollisjonShape2D

Varseltrekanten i dette tilfellet er at at CollisjonShape2D manglar faktisk kollisjon. Dette kan du fikse ved Ă„ tyrkke pĂ„ noden (til venstre), sĂ„ kjem det opp eit panel pĂ„ hĂžgre side. Her fĂ„r du ei haug med informasjon om noden du kan endre pĂ„. Gjerne leik rundt med det som er der. Men den vi vil fokusere pĂ„ er “Shape”, sett denne til for eksempel RectangleShape2D. Det er ikkje sĂ„ veldig viktig, vi skal ikkje bruke kollisjonane her.

Del 1c - Legge til ei Sprite, bilete

Om du trykkjer pĂ„ Sprite2D til venstre, fĂ„r du opp feltet til hĂžgre, der det stĂ„r “Texture”. Her kan du putte inn eit bilete til spelaren. Det er berre Ă„ dra eit bilete inn og sleppe det i feltet.

Slik vil det sjÄ ut etter Ä ha lagt til ei sprite.

Sprite menu

Del 2 - Legge til input, kontrollere

PĂ„ toppen av vinduet er det ei meny, “Scene - Project - Debug - Editor - Help”. Trykk pĂ„ “Project” og deretter “Project Settings”. Her fĂ„r du opp ei meny med masse innstillingar. Trykk pĂ„ “Input Map”. Her kan de setje opp knappar pĂ„ tastaturet.

  • I “Add New Action” feltet, skriv “left” ĂČg trykk “Add”.
  • Legg deretter til “right”, “up” og “down”.
  • Desse blir kjende som “Actions”
  • PĂ„ kvar “Action” kan de leggje inn knappar med Ă„ trykkje pĂ„ + knappen til hĂžgre.

Plus button

  • Her er det berre Ă„ trykkje pĂ„ tastaturet, sĂ„ trykkje Add.
  • Legg til knappar pĂ„ alle actions.

Del 3 - Legge til eit script for Ă„ styre spelaren.

For Ä kunne legge til spelelogikk, altsÄ gjere noko med spelaren, bakgrunnen, eller kva enn det skulle vere i spelet, treng vi eit script. Scripts er kode, og kan skrivast i to sprÄk, GDScript eller C#, GDScript er default.

  • Trykk pĂ„ “CharacterBody2D” (eg har kalla han “Player”) noden.
  • Trykk pĂ„ “Attach Script” knappen (sjĂ„ under)

Attach script button

  • Her fĂ„r de opp eit vindu der de kan velje sprĂ„k (velg GDScript) og ein path (berre la han heite det som stĂ„r der, men de kan gje han namn), ogsĂ„ trykk vidare. Her fĂ„r de opp eit “Script”-vindu. Det stĂ„r ikkje mykje her til Ă„ byrje med.

extends CharacterBody2D

# Dette er en enkel karakterbevegelse
# This is a simple character movement
# Dette er ei enkel karakterrĂžrsle

Det einaste denne koden seier for augnablikket er at koden skal hĂžyre til ei node av typen “CharacterBody2D”, som er spelaren vĂ„r.

Vi skal leggje til ei funksjon her som vi skal bruke til Ă„ manipulere spelaren:

extends CharacterBody2D

func _physics_process(delta: float) -> void:
   # Dette er ein funksjon som vert kalla kvar fysikkramme.
   # Her kan du leggje til kode som skal kĂžyrast kvar fysikkramme.
   return

Fysisk prosess?

_physics_process er ei funksjon som vert oppdatert for kvar einaste “frame”, altsĂ„ om lag 60 gongar i sekundet (standard). Det finst ei anna funksjon som berre heiter _process, som vert oppdatert heile vegen. Om du vil at spelaren skal rĂžrsla i eit jamnt tempo, brukar du _physics_process.

Det er her me skal leggja til kode som flyttar spelaren.

Del 4 - Grunnleggjande inndata

I del 2 la du til inndata-knappar, no skal vi bruke dei. Det finst eit innebygd objekt som heiter Input som vi kan bruke til Ă„ sjekke om spelaren har trykt pĂ„ det som vi har sett opp i “Input Map”.

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

if Input.is_action_pressed('right'):
   # Flytt karakteren til hĂžgre
   velocity.x = 100

# UtfĂžr bevegelsen
move_and_slide()

Kva er move_and_slide()?

move_and_slide() er ei innebygd funksjon i Godot som vert brukt nÄr vi vil rÞyndomleg flytte det vi brukar det pÄ. Utytt denne vil ikkje spelaren rÞyndomleg flytte seg.

Warning

Rommet pÄ linjene er svÊrt viktig, dette er likt som i Python.

Kva skjer nÄr du start programmet med Ä trykkja pÄ play-knappen i Godot-vinduet, sÄ trykkjer «right»?

Om ingenting skjer no:

  • Har du hugsa Ă„ setja opp noko i «Input Map»?
  • Har du skrive right og ikkje Right? AltsĂ„, er det du skreiv i koden det same som namnet i input map?

Heile 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 no Ă„ leggja til kode for 'left', 'up', 'down'.

Kva mÄ velocity.x vera for left? Kva med up og down?

Heile koden no
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

De legg kanskje merke til at spelaren ikkje stoggar nÄr du slepper ei retning. Det kan vi fikse pÄ no!

FĂžr alle if-ane, legg til ei linje som set hastigheita til 0. Det kan du gjere med Ă„ skrive velocity = Vector2()

Alle hastigheitar og retningar i Godot er vektorer, dette er eit matte-konsept vi ikkje skal gÄ inn pÄ no, men om du lurer meir pÄ kva dette betyr, kan de gÄ hit: Wikipedia vectors.

Heile koden no
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 starta spelet no kan du flytte rundt pÄ spelaren:

Vidare kan de fikse pÄ koden til Ä gjere at farten ikkje berre er eit tal, men kan lagrast eit anna stad.

Du kan for eksempel (fÞr funksjonen) leggje til ei konstant som held styre pÄ farten.

Heile 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 sjþlv!

Om de gÄr tilbake til den fÞrste delen, Nyttige Ressurser, kan dei finne kva dei kan fortsette Ä leke med.

Etter dette kan dei prÞve Ä lage sitt eige spel. Kva dei lagar er opp til dei! Om du vil lage noko heilt nytt, gjer det! Om dei vil prÞve Ä etterligne eit spel som alt finst, gjer det! Best mÄte Ä lÊre pÄ er Ä prÞve!