Botsingsdetectie heeft invloed op de meeste delen van je spel, van hoe je speler op een platform staat tot hoe hij vijanden vernietigt.

Botsingsdetectie is een van de cruciale aspecten van de ontwikkeling van games en heeft een aanzienlijke invloed op de spelerservaring. Nauwkeurige botsingsdetectie zorgt ervoor dat gamekarakters naadloos samenwerken met hun omgeving, waardoor een gevoel van onderdompeling en realisme ontstaat.

Godot, een populaire open-source game-engine, biedt krachtige tools voor het implementeren van efficiënte botsingsdetectie, wat resulteert in een soepele en boeiende gameplay.

Het Godot-spel opzetten

Maak voordat je begint een eenvoudig 2D-platformspel in Godot 4. Begin met het opzetten van de gamescène met een spelerspersonage en platforms.

De code die in dit artikel wordt gebruikt, is hierin beschikbaar GitHub-opslagplaats en kunt u gratis gebruiken onder de MIT-licentie.

Maak een nieuwe scène en voeg een toe KarakterLichaam2D knooppunt als het hoofdknooppunt. Voeg een... toe

instagram viewer
Sprite2D knooppunt als een kind van de KarakterLichaam2D om het personage van de speler visueel weer te geven.

Volgende, beweging toevoegen aan de speler teken met 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)

Voeg ten slotte platforms toe aan de scène met behulp van StatischBody2D knooppunten om de basisconfiguratie te voltooien.

Verschillende botsingsvormen

Godot biedt een verscheidenheid aan botsingsvormen die geschikt zijn voor verschillende soorten spelobjecten. Deze botsingsvormen helpen bij het nauwkeurig definiëren van het gebied waarbinnen botsingsdetectie plaatsvindt.

Voordat je in de verschillende botsingsvormen duikt, is het belangrijk op te merken dat je er één rechtstreeks aan het personage van de speler kunt koppelen om het botsingsgebied te definiëren. Hierdoor kunt u het precieze gebied controleren om botsingen te detecteren.

Cirkelbotsingsvorm

Een cirkelbotsingsvorm is vooral handig voor personages die radiaal met de omgeving moeten communiceren. Je kunt deze vorm gebruiken voor karakters met een ronde of bolvormige hitbox. Om een ​​cirkelbotsingsvorm aan je spelerspersonage toe te voegen:

# 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)

Rechthoekige botsingsvorm

Rechthoekige botsingsvormen zijn geschikt voor karakters met een meer vierkante of rechthoekige vorm. Zo kunt u een rechthoekige botsingsvorm toevoegen:

# 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)

Convexe veelhoekbotsingsvorm

Convexe polygoon-botsingsvormen bieden grote flexibiliteit voor tekens met onregelmatige of niet-rechthoekige vormen. Je kunt deze vorm gebruiken om nauw aan te sluiten bij de omtrek van je personage. Om een ​​convexe polygoon-botsingsvorm toe te voegen:

# 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)

Door de juiste botsingsvorm te kiezen en deze aan het personage van de speler te bevestigen, kun je precies doen botsingen binnen het aangewezen gebied detecteren, waardoor de nauwkeurigheid van interacties met het spel wordt verbeterd wereld.

Botsingen detecteren

Het detecteren van botsingen tussen objecten is essentieel voor het implementeren van interacties en gameplay-mechanica. In Godot kun je dit bereiken met behulp van de ingebouwde fysica-engine.

# 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")

Hieronder vindt u de uitvoer:

Botsingssignalen en botsingsmaskers

Godot biedt botsingssignalen en botsingsmaskers als krachtige hulpmiddelen om verfijning aan je spel toe te voegen.

Botsingssignalen

Botsingssignalen zijn gebeurtenissen die de fysica-engine activeert wanneer er botsingen plaatsvinden. Deze signalen bieden objecten de mogelijkheid om met elkaar te communiceren en op botsingen te reageren. In Godot kunt u verbinding maken met botsingssignalen om aangepaste logica uit te voeren wanneer specifieke botsingsgebeurtenissen plaatsvinden.

Stel dat u bijvoorbeeld een geluidseffect wilt afspelen wanneer het personage van de speler in botsing komt met een verzamelvoorwerp. Hier leest u hoe u dit kunt bereiken met behulp van botsingssignalen:

# 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()

In dit voorbeeld is de body_ingevoerd signaal wordt uitgezonden wanneer het personage van de speler in botsing komt met een ander natuurkundig lichaam. Door dit signaal aan te sluiten op de _on_body_ingevoerd functie, kunt u reageren op de botsingsgebeurtenis. Als het botsende lichaam zich in de verzamelbaar groep, dat kan een auteursrechtvrij geluidseffect afspelen.

Botsingsmaskers

Met botsingsmaskers kunt u bepalen welke botsingslagen met elkaar kunnen communiceren. Elke botsingslaag komt overeen met een bit in een bitmasker. Door botsingslagen en maskers aan objecten toe te wijzen, kunt u nauwkeurig afstemmen welke objecten met elkaar botsen en de prestaties optimaliseren.

Stel je bijvoorbeeld voor dat je vijanden en kogels in je spel hebt. Je wilt dat vijanden tegen platforms botsen, maar niet tegen elkaar. Je wilt ook dat kogels tegen vijanden botsen, maar niet tegen platforms. Hier leest u hoe u dit kunt bereiken met botsingsmaskers:

# 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)

Door botsingsmaskers selectief in of uit te schakelen, bepaalt u welke objecten met elkaar kunnen botsen, wat resulteert in nauwkeurige en efficiënte botsingsinteracties.

Best practices voor botsingsdetectie

Houd rekening met deze best practices om een ​​soepele gameplay en efficiënte botsingsdetectie te garanderen.

Gebruik eenvoudige vormen

Complexe botsingsvormen kunnen veel hulpbronnen vergen. Gebruik waar mogelijk eenvoudige vormen zoals cirkels en rechthoeken voor botsingsdetectie.

Laagbotsingsmaskers

Met Godot kunt u botsingslagen en maskers definiëren. Gebruik deze om te bepalen welke objecten met elkaar botsen, waardoor de prestaties worden geoptimaliseerd.

In een platformgame kan bijvoorbeeld de speler kan op platforms springen en langs muren glijden. Door botsingslagen en maskers op de juiste manier in te stellen, kunt u onderscheidend gedrag bereiken.

Botsingsgroepen

Groepeer objecten met vergelijkbare botsingseigenschappen voor eenvoudiger beheer en efficiënte botsingsdetectie.

Grenzende vakken

Voor prestatie-optimalisatie kunt u selectiekaders gebruiken om snel te controleren of objecten in de buurt zijn voordat u nauwkeurige botsingsdetectie uitvoert.

Gebruik kinematische zoekopdrachten

Godot biedt kinematische zoekopdrachten om botsingscontroles uit te voeren zonder het object daadwerkelijk te verplaatsen. Dit kan handig zijn om botsingen te voorspellen voordat ze plaatsvinden.

Maak Godot-spellen aantrekkelijker met botsingsdetectie

Het integreren van efficiënte botsingsdetectie in je Godot-spel zorgt niet alleen voor naadloze interactie tussen personages en de omgeving, maar opent ook mogelijkheden voor creatieve gameplay mechanica.

Of het nu gaat om platformuitdagingen, het oplossen van puzzels of gevechtsscenario's, botsingsdetectie vormt de kern van de betrokkenheid van spelers. Door botsingsdetectie toe te voegen, kun je een spel creëren dat spelers boeit met zijn soepele en dynamische interacties.