Susidūrimų aptikimas turi įtakos daugeliui žaidimo dalių – nuo žaidėjo stovėjimo ant platformos iki priešų sunaikinimo.
Susidūrimų aptikimas yra vienas iš svarbiausių žaidimo kūrimo aspektų, turintis didelę įtaką žaidėjo patirčiai. Tikslus susidūrimų aptikimas užtikrina, kad žaidimo veikėjai sklandžiai sąveikauja su aplinka, sukurdami panardinimo ir tikroviškumo jausmą.
„Godot“, populiarus atvirojo kodo žaidimų variklis, suteikia galingų įrankių efektyviam susidūrimų aptikimui, todėl žaidimas vyksta sklandžiai ir patraukliai.
„Godot“ žaidimo nustatymas
Prieš pradėdami, sukurkite paprastą 2D platformingo žaidimą Godot 4. Pradėkite nustatydami žaidimo sceną su žaidėjo personažu ir platformomis.
Šiame straipsnyje naudojamas kodas pateikiamas čia GitHub saugykla ir jūs galite nemokamai naudotis pagal MIT licenciją.
Sukurkite naują sceną ir pridėkite a CharacterBody2D mazgas kaip šakninis mazgas. Pridėti Sprite2D mazgas kaip vaikas CharacterBody2D vizualiai pavaizduoti žaidėjo charakterį.
Kitas, pridėti žaidėjo judėjimą simbolis naudojant 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)
Galiausiai pridėkite platformų prie scenos naudodami StaticBody2D mazgus, kad užbaigtumėte pagrindinę sąranką.
Įvairios susidūrimo formos
„Godot“ siūlo įvairias susidūrimo formas, kurios tinka įvairių tipų žaidimo objektams. Šios susidūrimo formos padeda tiksliai apibrėžti sritį, kurioje vyksta susidūrimo aptikimas.
Prieš pasinerdami į įvairias susidūrimo formas, svarbu atkreipti dėmesį, kad galite ją pritvirtinti tiesiai prie žaidėjo personažo, kad apibrėžtumėte jo susidūrimo sritį. Tai leidžia valdyti tikslią sritį, kad aptiktumėte susidūrimą.
Apskritimo susidūrimo forma
Apskritimo susidūrimo forma ypač naudinga veikėjams, kuriems reikia radialiai sąveikauti su aplinka. Šią formą galite naudoti simboliams su apskritu arba sferiniu langeliu. Norėdami savo žaidėjo veikėjui pridėti apskritimo susidūrimo formą:
# 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)
Stačiakampio susidūrimo forma
Stačiakampės susidūrimo formos tinka personažams, turintiems daugiau dėžės ar stačiakampio formos. Štai kaip galite pridėti stačiakampio susidūrimo formą:
# 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)
Išgaubta daugiakampio susidūrimo forma
Išgaubtos daugiakampės susidūrimo formos suteikia didelį lankstumą netaisyklingų ar ne stačiakampių formų simboliams. Galite naudoti šią formą, kad tiksliai atitiktumėte savo personažo kontūrus. Norėdami pridėti išgaubtą daugiakampio susidūrimo formą:
# 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)
Pasirinkę tinkamą susidūrimo formą ir pritvirtinę ją prie žaidėjo personažo, galite tiksliai aptikti susidūrimus nurodytoje srityje, padidindami sąveikos su žaidimu tikslumą pasaulis.
Susidūrimų aptikimas
Objektų susidūrimų aptikimas yra būtinas norint įgyvendinti sąveiką ir žaidimo mechaniką. „Godot“ tai galite pasiekti naudodami įmontuotą fizikos variklį.
# 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")
Žemiau yra išvestis:
Susidūrimo signalai ir susidūrimo kaukės
Godot pateikia susidūrimo signalus ir susidūrimo kaukes kaip galingus įrankius, kurie suteikia žaidimui rafinuotumo.
Susidūrimo signalai
Susidūrimo signalai yra įvykiai, kuriuos fizinis variklis suaktyvina susidūrimo metu. Šie signalai suteikia galimybę objektams bendrauti tarpusavyje ir reaguoti į susidūrimus. „Godot“ galite prisijungti prie susidūrimo signalų, kad vykdytumėte pasirinktinę logiką, kai įvyksta konkretūs susidūrimo įvykiai.
Pavyzdžiui, tarkime, kad norite paleisti garso efektą, kai žaidėjo veikėjas susiduria su kolekcionuojamu daiktu. Štai kaip tai galite pasiekti naudodami susidūrimo signalus:
# 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()
Šiame pavyzdyje body_entered signalas skleidžiamas žaidėjui susidūrus su kitu fiziniu kūnu. Prijungę šį signalą prie _on_body_entered funkcija, galite reaguoti į susidūrimo įvykį. Jei susidūręs kūnas yra kolekcinis grupė, galite paleisti garso efektą be autorių teisių.
Susidūrimo kaukės
Susidūrimo kaukės leidžia valdyti, kurie susidūrimo sluoksniai gali sąveikauti vienas su kitu. Kiekvienas susidūrimo sluoksnis atitinka bitą bitų kaukėje. Objektams priskirdami susidūrimo sluoksnius ir kaukes, galite tiksliai sureguliuoti, kurie objektai susiduria vienas su kitu, ir optimizuoti veikimą.
Pavyzdžiui, įsivaizduokite, kad jūsų žaidime yra priešų ir kulkų. Norite, kad priešai susidurtų su platformomis, bet ne vienas su kitu. Taip pat norite, kad kulkos susidurtų su priešais, bet ne su platformomis. Štai kaip tai galite pasiekti naudodami susidūrimo kaukes:
# 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)
Selektyviai įjungdami arba išjungdami susidūrimo kaukes, jūs kontroliuojate, kurie objektai gali susidurti vienas su kitu, o tai lemia tikslią ir efektyvią susidūrimo sąveiką.
Geriausia susidūrimų aptikimo praktika
Norėdami užtikrinti sklandų žaidimą ir efektyvų susidūrimų aptikimą, apsvarstykite šiuos geriausios praktikos pavyzdžius.
Naudokite paprastas formas
Sudėtingos susidūrimo formos gali pareikalauti daug išteklių. Kai tik įmanoma, susidūrimui aptikti naudokite paprastas formas, pvz., apskritimus ir stačiakampius.
Sluoksnio susidūrimo kaukės
Godot leidžia apibrėžti susidūrimo sluoksnius ir kaukes. Naudokite juos norėdami valdyti, kurie objektai susiduria vienas su kitu, optimizuodami našumą.
Pavyzdžiui, platformingo žaidime žaidėjas gali šokinėti ant platformų ir slyskite palei sienas. Tinkamai nustatę susidūrimo sluoksnius ir kaukes, galite pasiekti skirtingą elgesį.
Susidūrimo grupės
Sugrupuokite objektus su panašiomis susidūrimo savybėmis, kad būtų lengviau valdyti ir efektyviai aptikti susidūrimus.
Apribojančios dėžės
Kad optimizuotumėte našumą, prieš atlikdami tikslų susidūrimo aptikimą naudokite ribojančius langelius, kad greitai patikrintumėte, ar netoliese yra objektų.
Naudokite kinematinę užklausą
„Godot“ teikia kinematinės užklausos, kad būtų galima atlikti susidūrimo patikrinimus, faktiškai nejudinant objekto. Tai gali būti naudinga norint numatyti susidūrimus prieš jiems įvykstant.
Kad „Godot“ žaidimai būtų patrauklesni susidūrimų aptikimo funkcija
Veiksmingo susidūrimo aptikimo įtraukimas į savo Godot žaidimą ne tik užtikrina sklandžią sąveiką tarp veikėjų ir aplinkos, bet taip pat atveria galimybes kūrybiškam žaidimui mechanika.
Nesvarbu, ar tai būtų platformos iššūkiai, galvosūkių sprendimas ar kovos scenarijai, susidūrimų aptikimas yra žaidėjų įsitraukimo pagrindas. Pridėję susidūrimo aptikimo funkciją galite sukurti žaidimą, kuris žavi žaidėjus sklandžia ir dinamiška sąveika.