Kollisionsdetektion påvirker de fleste dele af dit spil, fra hvordan din spiller står på en platform til hvordan de ødelægger fjender.

Kollisionsdetektion er et af de kritiske aspekter af spiludvikling, der har en væsentlig indvirkning på spilleroplevelsen. Nøjagtig kollisionsdetektion sikrer, at spilfigurer interagerer problemfrit med deres omgivelser, hvilket skaber en følelse af fordybelse og realisme.

Godot, en populær open source-spilmotor, giver kraftfulde værktøjer til implementering af effektiv kollisionsdetektion, hvilket resulterer i jævnt og engagerende gameplay.

Opsætning af Godot-spillet

Før du starter, skal du oprette et simpelt 2D-platformsspil i Godot 4. Start med at opsætte spilscenen med en spillerkarakter og platforme.

Koden brugt i denne artikel er tilgængelig i denne GitHub-depot og er gratis for dig at bruge under MIT-licensen.

Opret en ny scene og tilføj en CharacterBody2D node som rodnode. Tilføj en Sprite2D node som et barn af CharacterBody2D til visuelt at repræsentere spillerens karakter.

instagram viewer

Næste, tilføje bevægelse til afspilleren tegn ved hjælp af GDScript:

extends CharacterBody2D

var speed = 300

func _physics_process(delta):
var input_dir = Vector2.ZERO

if Input.is_action_pressed("ui_left"):
input_dir.x -= 1

if Input.is_action_pressed("ui_right"):
input_dir.x += 1

if Input.is_action_pressed("ui_up"):
input_dir.y -= 1

if Input.is_action_pressed("ui_down"):
input_dir.y += 1

velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)

Tilføj endelig platforme til scenen ved hjælp af StaticBody2D noder for at fuldføre den grundlæggende opsætning.

Forskellige kollisionsformer

Godot giver en række kollisionsformer, der henvender sig til forskellige typer spilobjekter. Disse kollisionsformer hjælper nøjagtigt med at definere det område, inden for hvilket kollisionsdetektion finder sted.

Før du dykker ned i de forskellige kollisionsformer, er det vigtigt at bemærke, at du kan knytte en direkte til spillerkarakteren for at definere dens kollisionsområde. Dette giver dig mulighed for at kontrollere det præcise område for at registrere kollision.

Cirkel kollision form

En cirkelkollisionsform er især nyttig for karakterer, der skal interagere radialt med omgivelserne. Du kan bruge denne form til tegn med en cirkulær eller sfærisk hitbox. Sådan tilføjer du en cirkelkollisionsform til din spillerkarakter:

# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 32
collision_shape.shape = circle_shape
add_child(collision_shape)

Rektangel kollisionsform

Rektangulære kollisionsformer er velegnede til karakterer med en mere kasseformet eller rektangulær form. Sådan kan du tilføje en rektangelkollisionsform:

# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var rect_shape = RectangleShape2D.new()
rect_shape.extents = Vector2(32, 64)
collision_shape.shape = rect_shape
add_child(collision_shape)

Konveks polygon kollisionsform

Konvekse polygonkollisionsformer giver stor fleksibilitet for tegn med uregelmæssige eller ikke-rektangulære former. Du kan bruge denne form til at matche omridset af din karakter. Sådan tilføjer du en konveks polygonkollisionsform:

# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var polygon_shape = ConvexPolygonShape2D.new()
polygon_shape.set_points([Vector2(-32, -64), Vector2(32, -64), Vector2(0, 64)])
collision_shape.shape = polygon_shape
add_child(collision_shape)

Ved at vælge den passende kollisionsform og vedhæfte den til spillerkarakteren kan du præcist registrere kollisioner inden for det udpegede område, hvilket øger nøjagtigheden af ​​interaktioner med spillet verden.

Registrering af kollisioner

Detektering af kollisioner mellem objekter er afgørende for implementering af interaktioner og gameplay-mekanik. I Godot kan du opnå dette ved hjælp af den indbyggede fysikmotor.

# Detecting Collisions in _physics_process
func _physics_process(delta):
var input_dir = Vector2.ZERO
#... (input handling)

velocity = input_dir.normalized() * speed
var collision = move_and_collide(velocity * delta)

if collision:
print("collided")

Nedenfor er output:

Kollisionssignaler og kollisionsmasker

Godot leverer kollisionssignaler og kollisionsmasker som kraftfulde værktøjer til at tilføje sofistikering til dit spil.

Kollisionssignaler

Kollisionssignaler er hændelser, som fysikmotoren udløser, når der opstår kollisioner. Disse signaler giver genstande mulighed for at kommunikere med hinanden og reagere på kollisioner. I Godot kan du oprette forbindelse til kollisionssignaler for at udføre tilpasset logik, når specifikke kollisionshændelser finder sted.

Sig f.eks., at du vil afspille en lydeffekt, når afspillerens karakter kolliderer med et samleobjekt. Sådan kan du opnå dette ved hjælp af kollisionssignaler:

# Inside the player character's script
func _ready():
connect("body_entered", self, "_on_body_entered")

func _on_body_entered(body: Node):
if body.is_in_group("collectible"):
# Play a sound effect
play_collectible_sound()

# Perform additional logic like collecting the item

# Remove the collectible from the scene
body.queue_free()

I dette eksempel er body_entered signalet udsendes, når spillerens karakter kolliderer med en anden fysik krop. Ved at forbinde dette signal til _på_kroppen_indført funktion, kan du reagere på kollisionshændelsen. Hvis det kolliderende legeme er i samleobjekt gruppe, kan du afspille en ophavsretsfri lydeffekt.

Kollisionsmasker

Kollisionsmasker giver dig mulighed for at kontrollere, hvilke kollisionslag der kan interagere med hinanden. Hvert kollisionslag svarer til en bit i en bitmaske. Ved at tildele kollisionslag og masker til objekter kan du finjustere, hvilke objekter der kolliderer med hinanden og optimere ydeevnen.

Forestil dig for eksempel, at du har fjender og kugler i dit spil. Du vil have fjender til at kollidere med platforme, men ikke med hinanden. Du vil også have, at kugler kolliderer med fjender, men ikke med platforme. Sådan kan du opnå dette ved at bruge kollisionsmasker:

# Inside the enemy's script
func _ready():
# Disable collision with other enemies
set_collision_mask_value(2, false)

# Enable collision with platforms
set_collision_mask_value(3, true)

# Inside the bullet's script
func _ready():
# Enable collision with enemies
set_collision_mask_value(2, true)

# Disable collision with platforms
set_collision_mask_value(3, false)

Ved selektivt at aktivere eller deaktivere kollisionsmasker styrer du, hvilke objekter der kan kollidere med hinanden, hvilket resulterer i nøjagtige og effektive kollisionsinteraktioner.

Bedste praksis for kollisionsdetektion

Overvej disse bedste fremgangsmåder for at sikre jævnt gameplay og effektiv kollisionsdetektion.

Brug simple former

Komplekse kollisionsformer kan være ressourcekrævende. Når det er muligt, skal du bruge simple former som cirkler og rektangler til kollisionsdetektion.

Lag kollisionsmasker

Godot giver dig mulighed for at definere kollisionslag og masker. Brug disse til at kontrollere, hvilke objekter der kolliderer med hinanden, hvilket optimerer ydeevnen.

For eksempel, i et platformspil, den spiller kan hoppe på platforme og glide langs vægge. Ved at opsætte kollisionslag og masker på passende måde kan du opnå særskilt adfærd.

Kollisionsgrupper

Gruppér objekter med lignende kollisionsegenskaber for lettere styring og effektiv kollisionsdetektion.

Afgrænsningskasser

For at optimere ydeevnen skal du bruge afgrænsningsfelter til hurtigt at kontrollere, om objekter er i nærheden, før du udfører præcis kollisionsdetektion.

Brug kinematiske forespørgsler

Godot giver kinematiske forespørgsler til at udføre kollisionstjek uden faktisk at flytte objektet. Dette kan være nyttigt til at forudsige kollisioner, før de sker.

Gør Godot-spil mere engagerende med kollisionsdetektion

Inkorporering af effektiv kollisionsdetektion i dit Godot-spil sikrer ikke kun problemfri interaktion mellem karakterer og miljøet, men åbner også muligheder for kreativt gameplay mekanik.

Uanset om det er platformudfordringer, opgaveløsning eller kampscenarier, er kollisionsdetektion kernen i spillerengagementet. Ved at tilføje kollisionsdetektion kan du skabe et spil, der fængsler spillere med dets glatte og dynamiske interaktioner.