Detekce kolize ovlivňuje většinu částí vaší hry, od toho, jak váš hráč stojí na platformě, až po to, jak ničí nepřátele.
Detekce kolize je jedním z kritických aspektů vývoje hry, který významně ovlivňuje zážitek hráče. Přesná detekce kolizí zajišťuje bezproblémovou interakci herních postav se svým prostředím a vytváří pocit ponoření a realismu.
Godot, populární open-source herní engine, poskytuje výkonné nástroje pro implementaci efektivní detekce kolizí, což má za následek plynulé a poutavé hraní.
Nastavení hry Godot
Než začnete, vytvořte v Godot 4 jednoduchou 2D plošinovku. Začněte nastavením herní scény s hráčskou postavou a platformami.
Kód použitý v tomto článku je k dispozici v tomto úložiště GitHub a můžete jej používat zdarma pod licencí MIT.
Vytvořte novou scénu a přidejte a CharacterBody2D uzel jako kořenový uzel. Přidat Sprite2D uzel jako dítě CharacterBody2D vizuálně reprezentovat postavu hráče.
Další, přidat pohyb hráči znak pomocí GDScript:
extends CharacterBody2D
var speed = 300
func _physics_process(delta):
var input_dir = Vector2.ZEROif Input.is_action_pressed("ui_left"):
input_dir.x -= 1if Input.is_action_pressed("ui_right"):
input_dir.x += 1if Input.is_action_pressed("ui_up"):
input_dir.y -= 1if Input.is_action_pressed("ui_down"):
input_dir.y += 1
velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)
Nakonec přidejte platformy do scény pomocí StaticBody2D uzly k dokončení základního nastavení.
Různé tvary kolize
Godot poskytuje různé tvary kolizí, které vyhovují různým typům herních objektů. Tyto tvary kolize pomáhají přesně definovat oblast, ve které probíhá detekce kolize.
Než se ponoříte do různých tvarů kolize, je důležité poznamenat, že jeden můžete připojit přímo k postavě hráče a definovat tak oblast kolize. To vám umožní ovládat přesnou oblast pro detekci kolize.
Tvar kruhové srážky
Tvar kolize kruhu je zvláště užitečný pro postavy, které potřebují radiálně interagovat s prostředím. Tento tvar můžete použít pro postavy s kruhovým nebo kulovým hitboxem. Chcete-li k postavě hráče přidat tvar kolize 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)
Tvar obdélníku srážky
Obdélníkové kolizní tvary jsou vhodné pro postavy s více hranatým nebo obdélníkovým tvarem. Zde je návod, jak můžete přidat tvar kolize obdélníku:
# 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í tvar kolize mnohoúhelníku
Tvary kolize konvexních mnohoúhelníků poskytují velkou flexibilitu pro znaky s nepravidelnými nebo nepravoúhlými tvary. Tento tvar můžete použít, aby co nejlépe odpovídal obrysu vaší postavy. Chcete-li přidat tvar kolize konvexního mnohoúhelníku:
# 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ýběrem vhodného tvaru kolize a jeho připojením k postavě hráče můžete přesně detekuje kolize v určené oblasti a zvyšuje přesnost interakcí s hrou svět.
Detekce kolizí
Detekce kolizí mezi objekty je zásadní pro implementaci interakcí a herních mechanismů. V Godot toho můžete dosáhnout pomocí vestavěného fyzikálního 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")
Níže je výstup:
Kolizní signály a kolizní masky
Godot poskytuje kolizní signály a kolizní masky jako výkonné nástroje, které vaší hře přidají sofistikovanost.
Kolizní signály
Kolizní signály jsou události, které fyzikální engine spustí, když dojde ke srážce. Tyto signály umožňují objektům komunikovat mezi sebou a reagovat na kolize. V Godot se můžete připojit ke kolizním signálům a spustit vlastní logiku, když dojde ke konkrétním kolizním událostem.
Řekněme například, že chcete přehrát zvukový efekt, když se postava hráče srazí se sběratelským předmětem. Zde je návod, jak toho můžete dosáhnout pomocí kolizních signálů:
# 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 příkladu je body_entered signál je vydán, když se postava hráče srazí s jiným fyzikálním tělem. Připojením tohoto signálu k _on_body_entered funkce, můžete reagovat na událost kolize. Pokud je narážející těleso v sběratelský skupině, můžete přehrávat zvukový efekt bez autorských práv.
Kolizní masky
Kolizní masky vám umožňují řídit, které kolizní vrstvy mohou na sebe vzájemně působit. Každá kolizní vrstva odpovídá bitu v bitové masce. Přiřazením kolizní vrstvy a masky k objektům můžete doladit, které objekty do sebe kolidují, a optimalizovat výkon.
Představte si například, že máte ve hře nepřátele a kulky. Chcete, aby se nepřátelé srazili s plošinami, ale ne mezi sebou. Také chcete, aby se kulky srážely s nepřáteli, ale ne s plošinami. Zde je návod, jak toho dosáhnout pomocí kolizní masky:
# 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)
Selektivním povolením nebo zakázáním kolizních masek ovládáte, které objekty mohou vzájemně kolidovat, což vede k přesným a efektivním kolizním interakcím.
Nejlepší postupy pro detekci kolize
Chcete-li zajistit plynulé hraní a efektivní detekci kolizí, zvažte tyto osvědčené postupy.
Používejte jednoduché tvary
Složité tvary kolize mohou být náročné na zdroje. Kdykoli je to možné, používejte pro detekci kolize jednoduché tvary, jako jsou kruhy a obdélníky.
Vrstvené kolizní masky
Godot umožňuje definovat kolizní vrstvy a masky. Pomocí nich můžete řídit, které objekty do sebe narážejí, a optimalizovat tak výkon.
Například v platformové hře, hráč může skákat na plošiny a klouzat po stěnách. Vhodným nastavením kolizní vrstvy a masky můžete dosáhnout odlišného chování.
Kolizní skupiny
Seskupte objekty s podobnými kolizními vlastnostmi pro snadnější správu a efektivní detekci kolize.
Vymezovací krabice
Pro optimalizaci výkonu použijte ohraničovací rámečky k rychlé kontrole, zda jsou objekty poblíž, před provedením přesné detekce kolize.
Použijte kinematické dotazy
Godot poskytuje kinematické dotazy pro provádění kontrol kolize bez skutečného pohybu objektu. To může být užitečné pro předpovídání kolizí dříve, než k nim dojde.
Díky detekci kolizí budou hry Godot ještě poutavější
Začlenění účinné detekce kolizí do vaší hry Godot nejen zajišťuje bezproblémovou interakci mezi postavami a prostředím, ale také otevírá příležitosti pro kreativní hru mechanika.
Ať už se jedná o plošinovky, řešení hádanek nebo bojové scénáře, detekce kolizí je jádrem zapojení hráčů. Přidáním detekce kolizí můžete vytvořit hru, která hráče zaujme svými hladkými a dynamickými interakcemi.