Detekcia kolízií ovplyvňuje väčšinu častí vašej hry, od toho, ako váš hráč stojí na platforme, až po to, ako ničí nepriateľov.

Detekcia kolízií je jedným z kritických aspektov vývoja hry, ktorý výrazne ovplyvňuje zážitok hráča. Presná detekcia kolízií zaisťuje bezproblémovú interakciu herných postáv so svojím prostredím, čím vytvára pocit ponorenia a realizmu.

Godot, populárny open-source herný engine, poskytuje výkonné nástroje na implementáciu efektívnej detekcie kolízií, výsledkom čoho je plynulá a pútavá hra.

Nastavenie hry Godot

Pred začatím vytvorte jednoduchú 2D plošinovku v Godot 4. Začnite nastavením hernej scény s postavou hráča a platformami.

Kód použitý v tomto článku je dostupný v tomto úložisko GitHub a môžete ho bezplatne používať na základe licencie MIT.

Vytvorte novú scénu a pridajte a CharacterBody2D uzol ako koreňový uzol. Pridaj Sprite2D uzol ako dieťa CharacterBody2D aby vizuálne reprezentoval postavu hráča.

Ďalšie, pridať pohyb hráčovi znak pomocou GDScript:

extends CharacterBody2D
instagram viewer

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)

Nakoniec pridajte platformy do scény pomocou StaticBody2D uzly na dokončenie základného nastavenia.

Rôzne tvary kolízie

Godot poskytuje rôzne kolízne tvary, ktoré vyhovujú rôznym typom herných predmetov. Tieto kolízne tvary pomáhajú presne definovať oblasť, v ktorej prebieha detekcia kolízie.

Pred ponorením sa do rôznych kolíznych tvarov je dôležité poznamenať, že jeden môžete pripojiť priamo k postave hráča a definovať tak oblasť kolízie. To vám umožňuje kontrolovať presnú oblasť na zistenie kolízie.

Tvar kruhovej kolízie

Tvar kolízie kruhu je obzvlášť užitočný pre postavy, ktoré potrebujú radiálne interagovať s prostredím. Tento tvar môžete použiť pre postavy s kruhovým alebo sférickým hitboxom. Ak chcete k postave hráča pridať tvar kolízie kruhu:

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

Obdĺžnikový tvar kolízie

Obdĺžnikové kolízne tvary sú vhodné pre postavy s hranatejšou alebo pravouhlou formou. Tu je postup, ako môžete pridať tvar kolízie obdĺžnika:

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

Konvexný polygónový tvar kolízie

Konvexné polygónové kolízne tvary poskytujú veľkú flexibilitu pre postavy s nepravidelnými alebo neobdĺžnikovými tvarmi. Tento tvar môžete použiť tak, aby presne zodpovedal obrysu vašej postavy. Ak chcete pridať tvar kolízie konvexného mnohouholníka:

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

Výberom vhodného tvaru kolízie a jej pripevnením k postave hráča môžete presne detekovať kolízie v určenej oblasti, čím sa zvyšuje presnosť interakcií s hrou sveta.

Detekcia kolízií

Detekcia kolízií medzi objektmi je nevyhnutná pre implementáciu interakcií a herných mechanizmov. V Godot to môžete dosiahnuť pomocou vstavaného fyzikálneho enginu.

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

Nižšie je výstup:

Kolízne signály a kolízne masky

Godot poskytuje kolízne signály a kolízne masky ako výkonné nástroje na pridanie sofistikovanosti do vašej hry.

Kolízne signály

Kolízne signály sú udalosti, ktoré fyzikálny motor spúšťa, keď dôjde ku kolízii. Tieto signály poskytujú objektom spôsob, ako medzi sebou komunikovať a reagovať na kolízie. V Godot sa môžete pripojiť k signálom kolízie a spustiť vlastnú logiku, keď nastanú špecifické kolízne udalosti.

Povedzme napríklad, že chcete prehrať zvukový efekt, keď sa postava hráča zrazí so zberateľským predmetom. Tu je návod, ako to môžete dosiahnuť pomocou kolíznych signálov:

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

V tomto príklade body_entered signál sa vyšle, keď sa postava hráča zrazí s iným fyzikálnym telom. Pripojením tohto signálu k _on_body_entered môžete reagovať na udalosť kolízie. Ak je zrážkové teleso v zberateľský skupina, môžete prehrajte zvukový efekt bez autorských práv.

Kolízne masky

Kolízne masky vám umožňujú ovládať, ktoré kolízne vrstvy môžu na seba vzájomne pôsobiť. Každá kolízna vrstva zodpovedá bitu v bitovej maske. Priradením kolíznych vrstiev a masiek k objektom môžete doladiť, ktoré objekty do seba kolidujú, a optimalizovať výkon.

Predstavte si napríklad, že máte v hre nepriateľov a guľky. Chcete, aby sa nepriatelia zrazili s platformami, ale nie medzi sebou. Tiež chcete, aby sa guľky zrazili s nepriateľmi, ale nie s plošinami. Tu je návod, ako to môžete dosiahnuť pomocou kolíznych masiek:

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

Selektívnym povolením alebo zakázaním kolíznych masiek ovládate, ktoré objekty môžu navzájom kolidovať, čo vedie k presným a efektívnym kolíznym interakciám.

Osvedčené postupy pre detekciu kolízie

Ak chcete zabezpečiť plynulé hranie a efektívnu detekciu kolízií, zvážte tieto osvedčené postupy.

Použite jednoduché tvary

Komplexné kolízne tvary môžu byť náročné na zdroje. Vždy, keď je to možné, používajte na detekciu kolízií jednoduché tvary, ako sú kruhy a obdĺžniky.

Vrstvené kolízne masky

Godot vám umožňuje definovať kolízne vrstvy a masky. Pomocou nich môžete ovládať, ktoré objekty sa navzájom zrážajú, čím sa optimalizuje výkon.

Napríklad v platformovej hre, hráč môže skákať na plošiny a posúvajte sa po stenách. Vhodným nastavením kolíznych vrstiev a masiek môžete dosiahnuť odlišné správanie.

Kolízne skupiny

Zoskupujte objekty s podobnými kolíznymi vlastnosťami pre jednoduchšiu správu a efektívnu detekciu kolízií.

Vymedzovacie škatule

Pre optimalizáciu výkonu použite ohraničovacie rámčeky na rýchlu kontrolu, či sa objekty nachádzajú v blízkosti pred vykonaním presnej detekcie kolízie.

Použite kinematické dotazy

Godot poskytuje kinematické dotazy na vykonanie kontroly kolízie bez toho, aby sa objekt skutočne pohyboval. To môže byť užitočné pri predpovedaní kolízií skôr, ako k nim dôjde.

Vďaka detekcii kolízií budú hry Godot pútavejšie

Začlenenie efektívnej detekcie kolízií do vašej hry Godot nielenže zaisťuje bezproblémovú interakciu medzi postavami a prostredím, no zároveň otvára možnosti pre kreatívnu hru mechanika.

Či už ide o platformové výzvy, riešenie hádaniek alebo bojové scenáre, detekcia kolízií je jadrom zapojenia hráčov. Pridaním detekcie kolízií môžete vytvoriť hru, ktorá zaujme hráčov svojimi plynulými a dynamickými interakciami.