Wykrywanie kolizji wpływa na większość elementów gry, od tego, jak gracz stoi na platformie po sposób, w jaki niszczy wrogów.

Wykrywanie kolizji to jeden z kluczowych aspektów tworzenia gier, znacząco wpływający na doświadczenie gracza. Dokładne wykrywanie kolizji zapewnia płynną interakcję postaci w grze z otoczeniem, tworząc wrażenie zanurzenia i realizmu.

Godot, popularny silnik gier typu open source, zapewnia potężne narzędzia do wdrażania skutecznego wykrywania kolizji, co zapewnia płynną i wciągającą rozgrywkę.

Konfigurowanie gry Godot

Zanim zaczniesz, utwórz prostą platformówkę 2D w Godot 4. Zacznij od skonfigurowania sceny gry z postacią gracza i platformami.

Kod użyty w tym artykule jest dostępny w this Repozytorium GitHuba i jest darmowy do użytku na licencji MIT.

Utwórz nową scenę i dodaj PostaćCiało2D węzeł jako węzeł główny. Dodać Sprite2D węzeł jako element podrzędny PostaćCiało2D wizualnie przedstawiać postać gracza.

Następny, dodać ruch do odtwarzacza znak przy użyciu GDScript:

instagram viewer
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)

Na koniec dodaj platformy do sceny za pomocą StatyczneBody2D węzłów, aby zakończyć podstawową konfigurację.

Różne kształty kolizji

Godot zapewnia różnorodne kształty kolizji, które odpowiadają różnym typom obiektów w grze. Te kształty kolizji pomagają dokładnie zdefiniować obszar, w którym odbywa się wykrywanie kolizji.

Zanim zagłębisz się w różne kształty kolizji, ważne jest, aby pamiętać, że możesz dołączyć je bezpośrednio do postaci gracza, aby określić jej obszar kolizji. Umożliwia to kontrolowanie dokładnego obszaru w celu wykrycia kolizji.

Kształt kolizji koła

Okrągły kształt kolizji jest szczególnie przydatny w przypadku postaci, które muszą wchodzić w interakcję z otoczeniem promieniowo. Możesz użyć tego kształtu dla postaci z okrągłym lub sferycznym hitboxem. Aby dodać kształt kolizyjny do swojej postaci gracza:

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

Kształt kolizji prostokąta

Prostokątne kształty kolizyjne są odpowiednie dla postaci o bardziej pudełkowatej lub prostokątnej formie. Oto jak dodać prostokątny kształt kolizji:

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

Kształt kolizji wypukłego wielokąta

Wypukłe kształty kolizji wielokątów zapewniają dużą elastyczność w przypadku znaków o nieregularnych lub nieprostokątnych kształtach. Możesz użyć tego kształtu, aby ściśle dopasować się do konturu swojej postaci. Aby dodać kształt kolizji wypukłego wielokąta:

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

Wybierając odpowiedni kształt kolizji i dołączając go do postaci gracza, możesz precyzyjnie wykrywać kolizje w wyznaczonym obszarze, zwiększając dokładność interakcji z grą świat.

Wykrywanie kolizji

Wykrywanie kolizji między obiektami jest niezbędne do wdrożenia interakcji i mechaniki rozgrywki. W Godocie możesz to osiągnąć dzięki wbudowanemu silnikowi fizycznemu.

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

Poniżej znajduje się wynik:

Sygnały kolizyjne i maski kolizyjne

Godot zapewnia sygnały kolizyjne i maski kolizyjne jako potężne narzędzia, które dodają wyrafinowania Twojej grze.

Sygnały kolizyjne

Sygnały kolizyjne to zdarzenia wyzwalane przez silnik fizyki w przypadku wystąpienia kolizji. Sygnały te umożliwiają obiektom komunikację między sobą i reagowanie na kolizje. W Godocie możesz połączyć się z sygnałami kolizyjnymi, aby wykonać niestandardową logikę, gdy mają miejsce określone zdarzenia kolizyjne.

Załóżmy na przykład, że chcesz odtworzyć efekt dźwiękowy, gdy postać gracza zderza się z przedmiotem kolekcjonerskim. Oto jak można to osiągnąć za pomocą sygnałów kolizyjnych:

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

W tym przykładzie ciało_wprowadzone sygnał jest emitowany, gdy postać gracza zderza się z innym ciałem fizycznym. Podłączając ten sygnał do _on_body_entered funkcję, możesz zareagować na zdarzenie kolizyjne. Jeśli zderzające się ciało znajduje się w kolekcjonerskie grupie, możesz odtwórz efekt dźwiękowy wolny od praw autorskich.

Maski kolizyjne

Maski kolizji pozwalają kontrolować, które warstwy kolizyjne mogą ze sobą oddziaływać. Każda warstwa kolizyjna odpowiada bitowi w masce bitowej. Przypisując warstwy kolizyjne i maski do obiektów, możesz precyzyjnie określić, które obiekty kolidują ze sobą i zoptymalizować wydajność.

Wyobraź sobie na przykład, że w swojej grze masz wrogów i kule. Chcesz, aby wrogowie zderzali się z platformami, ale nie ze sobą. Chcesz także, aby kule zderzały się z wrogami, ale nie z platformami. Oto jak można to osiągnąć za pomocą masek kolizyjnych:

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

Selektywne włączanie lub wyłączanie masek kolizji pozwala kontrolować, które obiekty mogą ze sobą kolidować, co skutkuje dokładnymi i wydajnymi interakcjami kolizyjnymi.

Najlepsze praktyki w zakresie wykrywania kolizji

Aby zapewnić płynną rozgrywkę i skuteczne wykrywanie kolizji, należy wziąć pod uwagę poniższe najlepsze praktyki.

Używaj prostych kształtów

Złożone kształty kolizji mogą wymagać dużych zasobów. Jeśli to możliwe, do wykrywania kolizji używaj prostych kształtów, takich jak koła i prostokąty.

Maski kolizji warstw

Godot umożliwia definiowanie warstw i masek kolizyjnych. Użyj ich, aby kontrolować, które obiekty kolidują ze sobą, optymalizując wydajność.

Na przykład w grze platformowej gracz może skakać po platformach i ślizgać się po ścianach. Konfigurując odpowiednio warstwy kolizyjne i maski, można uzyskać różne zachowania.

Grupy kolizji

Grupuj obiekty o podobnych właściwościach kolizyjnych, aby ułatwić zarządzanie i skuteczne wykrywanie kolizji.

Ramki ograniczające

Aby zoptymalizować wydajność, użyj ramek ograniczających, aby szybko sprawdzić, czy obiekty znajdują się w pobliżu, przed wykonaniem precyzyjnego wykrywania kolizji.

Użyj zapytań kinematycznych

Godot udostępnia zapytania kinematyczne umożliwiające sprawdzanie kolizji bez faktycznego przesuwania obiektu. Może to być przydatne do przewidywania kolizji, zanim one nastąpią.

Zwiększanie atrakcyjności gier Godot dzięki wykrywaniu kolizji

Włączenie skutecznego wykrywania kolizji do gry Godot nie tylko zapewnia płynną interakcję pomiędzy postaciami a otoczeniem, ale także otwiera możliwości kreatywnej rozgrywki mechanika.

Niezależnie od tego, czy chodzi o wyzwania platformowe, rozwiązywanie zagadek, czy scenariusze walki, wykrywanie kolizji jest podstawą zaangażowania gracza. Dodając wykrywanie kolizji, możesz stworzyć grę, która urzeka graczy płynnymi i dynamicznymi interakcjami.