We gaan een vijand toevoegen. De basis onderdelen zijn:
- de animatie frames
- een collision shape
- en een enemy script
Hiervoor maken we eerst een nieuwe scene
. In het paneel linksonder, klik je met de rechtermuisknop op res://
. Vervolgens kies je new
en dan scene
.
In de Create New Scene
dialoog klikken we op de Pick Root Node Type
knop.
Dan kunnen we in de Recent
lijst opnieuw CharacterBody2D
kiezen. Deze gebruikten we eerder ook voor de speler. Bevestig met de pick
knop.
Terug in de eerste dialog, typen we nu een naam voor onze vijand: 'Minotaur'. We bevestigen met ok
en onze nieuwe scene wordt gemaakt.
Net zoals bij onze speler voegen we 2 child nodes toe aan onze minotaurus: AnimatedSprite2D
en CollisionShape2D
.
Een shape instellen voor de collision shape is net hetzelfde als bij de speler. De vorm is ook een gedraaide CapsuleShape 2D
maar wat groter: radius
= 50, height
= 350 en rotation
= 90.
Onze AnimatedSprite2D
heeft SpriteFrames
nodig, die voegen we toe:
Klikken we nu nogmaal op deze nieuwe SpriteFrames
dan opent het paneel waar we de animaties kunnen samenstellen.
De minotaurus animaties zijn dezelfde als die van de speler: attack
, die
, hurt
, idle
en walk
. Deze voegen we toe met de Add Animation
knop, en we geven ze de juiste naam. De default
animatie mag weg.
Voor elke animatie moeten we nu de juiste beelden toevoegen met de Add frames from file
knop. De afbeeldingen staan in submappen van de map 'minotaur' onder onze 'assets'.
Alle animaties spelen aan 30 fps
. Enkel de idle
en walk
animatie hebben looping
AAN staan, bij de rest staat dit UIT.
Onze AnimatedSprite2D
staat nog te laag ten opzichte van onze CollisionShape2D
, de voeten van het monster moeten in de blauwe ovaal staan. We passen voor onze AnimatedSprite2D
de position
aan naar y
= -200.
Onze vijand tot leven brengen doen we met een script. Zorg dat de root node 'Minotaur' geselecteerd is en klik op de Attach Script
knop.
In de volgende dialoog gaan we een andere naam kiezen voor ons script: we noemen het script 'res://Enemy.gd' omdat we hetzelfde script willen gebruiken voor meerdere soorten vijanden. Bevestig door op Create
te klikken.
Het script voor de vijand gaan we geleidelijk opbouwen. We starten met het minimum: de vijand staat gewoon stil.
Verwijder alle voorbeeldcode en gebruik dit:
extends CharacterBody2D
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
func _physics_process(_delta):
sprite.play("idle")
Om te kunnen testen gaan we onze vijand in de wereld plaatsen. Sla eerst de huidige scene op met Ctrl+S
of kies in het hoofdmenu linksboven Scene
- Save
.
Dan keren we terug naar de 2D
view en selecteren we onze 'game' scene. We slepen onze 'Minotaur.tscn' vanuit het FileSystem
naar de 'Arena' node in onze scene
. Daarna kan je de speler en de vijand verslepen in de wereld zelf, zodat ze niet vlak bij mekaar staan.
Het valt misschien dadelijk op dat ons monstertje niet heel indrukwekkend is... We gaan hem eerst wat groter maken!
Dit is zo gebeurd: we openen terug de 'minotaur' scene, selecteren de AnimatedSprite2D
en zetten de scale
op 1.5
Nu staan onze voeten niet meer op de juiste plaats, daarom passen we position
terug aan zodat y
= -300
Nu dit gebeurd is, kunnen we testen! Start de game met de Run Project
knop of F5
.
Als we naar onze vijand toelopen, merken we dat er nog een probleem is. Het overlappen van de graphics klopt nog niet, onze minotaurus staat altijd vanboven, ook al loopt de speler 'voor' hem.
Als game engine heeft Godot hier natuurlijk een oplossing voor. Onze 'Arena' node heeft bij zijn properties een optie Y Sort Enabled
die we eenvoudig aan kunnen zetten.
Staat dit AAN, dan gaat Godot bij het tekenen van de child nodes van 'Arena' kijken naar de hoogte (y positie) en de nodes sorteren zodat de hoogste nodes 'vanonder' komen te liggen.
Dit zit er al beter uit:
In het volgende deel schrijven we een basis AI voor onze vijand: deel 5
Top comments (0)