Utilizați această tehnică pentru a îmbunătăți mișcarea și comportamentul inamicului, emulând viziunea de bază.

Detectarea liniei de vedere adaugă un strat de complexitate jocului tău cu un mecanism care permite personajelor sau obiectelor să-și perceapă împrejurimile. Puteți folosi această funcție pentru comportamentul AI inamicului, mecanismele de vizibilitate a jucătorilor, jocul ascuns și multe altele.

În Godot, nodul RayCast2D oferă o modalitate simplă și eficientă de a realiza detectarea liniei de vedere.

Configurarea jocului Godot

Înainte de a vă scufunda în nodurile RayCast2D, configurați un mediu de joc 2D de bază în Godot 4. Creează un jucător caracter care se poate deplasa folosind intrările de la tastatură și interacționează cu platformele.

Mai întâi, creați o scenă pentru personajul jucătorului. Adauga o CharacterBody2D nodul ca rădăcină a scenei. În interiorul CharacterBody2D, adauga o CollisionShape2D cu formă dreptunghiulară și a Sprite2D pentru reprezentarea vizuală a personajului.

instagram viewer

Codul folosit în acest articol este disponibil în acest articol Depozitul GitHub și este gratuit pentru utilizare sub licența MIT.

Iată codul GDScript pentru mișcarea jucătorului:

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)

Acum, creați niște platforme cu care jucătorul să interacționeze. Poți să folosești StaticBody2D noduri cu forme de coliziune adecvate pentru a reprezenta platformele. Aranjați-le în scenă pentru a crea un mediu de platformă.

Configurarea RayCast2D

Pentru a crea detectarea liniei de vedere, utilizați RayCast2D nodul. Iată cum puteți adăuga un RayCast2D nod folosind GDScript:

var raycast: RayCast2D

func _ready():
raycast = RayCast2D.new()
add_child(raycast)

Asigurați-vă că atașați acest script la CharacterBody2D nodul. Acest fragment de cod creează un nou RayCast2D nod și îl atașează ca copil personajului jucător.

Furnizarea de feedback vizual asupra interacțiunii cu linia vizuală

Acum, puteți imprima un mesaj ori de câte ori linia vizuală a jucătorului se intersectează cu o platformă. Aruncă o rază din poziția jucătorului în direcția mișcării. Dacă raza se ciocnește de un obiect, înseamnă că jucătorul are o linie de vedere către o platformă.

Adăugați următorul cod la același script:

func _physics_process(delta):
#... (previous movement code)

raycast.target_position = Vector2(100, 0)

if raycast.is_colliding():
print("Collided with platform!")

Iată rezultatul:

Extinderea funcționalității RayCast2D

Există multe funcții avansate pe care le puteți folosi pentru a îmbunătăți semnificativ interactivitatea și complexitatea jocului.

get_collider()

Folosind get_collider() metoda, puteți accesa primul obiect intersectat de rază. Metoda returnează null dacă nu se află niciun obiect în calea razei. Acest lucru este deosebit de util pentru identificarea obiectului specific pe care jucătorul dumneavoastră are o linie de vedere.

if raycast.is_colliding():
var collided_object = raycast.get_collider()

if collided_object:
print("You can see:", collided_object.name)

get_collider_rid()

The get_collider_rid() metoda vă poate spune ID-ul resursei (RID) al primului obiect intersectat:

if raycast.is_colliding():
var collider_rid = raycast.get_collider_rid()

if !collider_rid.is_valid():
print("No valid object RID")
else:
print("Object RID:", collider_rid)

get_collider_shape()

The get_collider_shape() funcția returnează ID-ul formei primului obiect intersectat sau 0 dacă nu are loc nicio coliziune.

if raycast.is_colliding():
var collider_shape = raycast.get_collider_shape()

if collider_shape == 0:
print("No valid shape ID")
else:
print("Shape ID:", collider_shape)

get_colision_normal()

Pentru a înțelege mai bine interacțiunea, get_colision_normal() vă furnizează normalul formei în punctul de coliziune. În cazurile în care raza începe în cadrul formei și lovit_din_interior este adevărat, normalul returnat va fi Vector2(0, 0).

if raycast.is_colliding():
var collision_normal = raycast.get_collision_normal()
print("Collision Normal:", collision_normal)

get_colision_point()

Când raza intersectează un obiect, get_colision_point() returnează punctul exact de coliziune în coordonate globale.

if raycast.is_colliding():
var collision_point = raycast.get_collision_point()
print("Collision Point:", collision_point)

Folosind aceste capabilități avansate ale RayCast2D nod, puteți obține informații critice asupra interacțiunilor dintre rază și obiectele care se ciocnesc.

Aceste metode vă permit să culegeți informații esențiale care pot avea un impact semnificativ asupra mecanicii de joc, interacțiunile cu obiectele și feedback-ul jucătorilor.

Inclusiv caracteristici suplimentare

Pe lângă funcționalitatea de bază de detectare a liniei de vedere, puteți îmbunătăți și mai mult dinamica jocului dvs. prin implementarea unor funcții avansate.

Declanșatoare de evenimente

În loc să imprimați doar un mesaj, puteți declanșa anumite evenimente din joc. De exemplu, dezvăluirea căilor ascunse, activarea mecanismelor sau alertarea inamicilor cu privire la prezența jucătorului poate adăuga profunzime jocului tău.

Manipularea dinamică a obstacolelor

Luați în considerare scenarii în care obstacolele pot împiedica linia vizuală. Implementarea detectării dinamice a obstacolelor asigură că linia vizuală se actualizează în timp real pe măsură ce obiectele se mișcă în și ies din vederea jucătorului.

Indicatori vizuali personalizați

În loc să te bazezi doar pe text, poți crea indicatori vizuali personalizați pentru a evidenția prezența interacțiunilor cu linia vizuală. Acest lucru ar putea implica schimbarea culorii jucătorului sau a obiectului sprite, afișarea unei pictograme sau animarea elementelor relevante.

Ceața de mecanică de război

Pentru jocurile de strategie sau de explorare, puteți introduce mecanica ceață a războiului. Acest lucru restrânge viziunea jucătorului până când acesta stabilește o linie de vedere, dezvăluind treptat lumea jocului și încurajând luarea deciziilor strategice.

Cele mai bune practici pentru detectarea liniei vizuale

Optimizarea detectării liniei de vedere este crucială pentru menținerea unei experiențe de joc fluide. Iată câteva dintre cele mai bune practici de reținut.

Frecvența Raycast

Evitați efectuarea de radiații la fiecare cadru dacă nu este necesar. Luați în considerare verificarea liniei de vedere numai atunci când poziția jucătorului sau mediul se schimbă semnificativ. Acest lucru ajută la reducerea calculelor inutile.

Lungimea razelor

Echilibrează lungimea raycast-ului tău. Razele extrem de lungi pot afecta performanța, așa că alegeți o lungime care să acopere zona necesară, menținând în același timp sarcina de calcul sub control.

Straturi de coliziune

Folosiți straturi de coliziune și măști pentru a regla fin ce obiecte ia în considerare detectarea liniei de vedere. Acest lucru previne radiațiile inutile către obiecte irelevante.

Memorarea în cache a rezultatelor

Dacă efectuați aceeași detecție a liniei de vedere pentru mai multe obiecte sau cadre, luați în considerare stocarea în cache a rezultatelor pentru a evita calculele redundante.

Integrare la nivel de platforme

Aliniați-vă mecanica de detectare a liniei de vedere cu designul de nivel al jocul tău platformer. Luați în considerare verticalitatea mediului, diferitele înălțimi ale platformei și potențialele obstacole care ar putea împiedica linia de vedere.

Asigurați-vă că sistemul dvs. de detectare acceptă aceste nuanțe pentru a crea o experiență de jucător perfectă și intuitivă.

Faceți jocurile Godot mai captivante cu detectarea liniei vizuale

Detectarea liniei de vedere adaugă profunzime și realism lumii tale de joc. Jucătorii pot elabora strategii, ascunde sau aborda provocările în mod diferit, în funcție de linia lor vizuală. Această mecanică poate transforma un simplu joc de platformă într-o experiență mai captivantă, făcând jocul mai captivant și mai memorabil.