Törmäysten havaitseminen vaikuttaa useimpiin pelin osiin, aina siitä, miten pelaaja seisoo alustalla vihollisten tuhoamiseen.
Törmäysten havaitseminen on yksi pelikehityksen kriittisistä näkökohdista, ja se vaikuttaa merkittävästi pelaajakokemukseen. Tarkka törmäystunnistus varmistaa, että pelihahmot ovat saumattomasti vuorovaikutuksessa ympäristönsä kanssa luoden upoutumisen ja realismin tunteen.
Godot, suosittu avoimen lähdekoodin pelimoottori, tarjoaa tehokkaita työkaluja tehokkaaseen törmäysten havaitsemiseen, mikä johtaa sujuvaan ja mukaansatempaavaan pelaamiseen.
Godot-pelin perustaminen
Ennen kuin aloitat, luo yksinkertainen 2D-tasohyppelypeli Godot 4:ssä. Aloita luomalla pelin kohtaus pelaajahahmolla ja alustoilla.
Tässä artikkelissa käytetty koodi on saatavilla tässä GitHub-arkisto ja sen käyttö on ilmaista MIT-lisenssin alaisena.
Luo uusi kohtaus ja lisää a CharacterBody2D node juurisolmuna. Lisää Sprite2D solmu lapsena CharacterBody2D esittää visuaalisesti pelaajan hahmoa.
Seuraava, lisää liikettä soittimeen merkki GDScriptillä:
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)
Lisää lopuksi alustat kohtaukseen käyttämällä StaticBody2D solmut suorittaaksesi perusasetukset loppuun.
Erilaiset törmäysmuodot
Godot tarjoaa erilaisia törmäysmuotoja, jotka sopivat erilaisiin peliobjekteihin. Nämä törmäysmuodot auttavat määrittelemään tarkasti alueen, jolla törmäyksen havaitseminen tapahtuu.
Ennen kuin sukellat erilaisiin törmäysmuotoihin, on tärkeää huomata, että voit liittää sellaisen suoraan pelaajahahmoon määrittääksesi sen törmäysalueen. Tämän avulla voit hallita tarkkaa aluetta törmäyksen havaitsemiseksi.
Ympyrän törmäysmuoto
Ympyrän törmäysmuoto on erityisen hyödyllinen hahmoille, joiden on oltava vuorovaikutuksessa ympäristön kanssa säteittäisesti. Voit käyttää tätä muotoa hahmoille, joilla on pyöreä tai pallomainen osumalaatikko. Ympyrän törmäysmuodon lisääminen pelaajahahmoosi:
# 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)
Suorakulmion törmäysmuoto
Suorakaiteen muotoiset törmäysmuodot sopivat hahmoille, joilla on enemmän laatikkomainen tai suorakulmainen muoto. Voit lisätä suorakulmion törmäysmuodon seuraavasti:
# 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)
Kupera monikulmion törmäysmuoto
Kuperat monikulmion törmäysmuodot tarjoavat suurta joustavuutta hahmoille, joiden muoto on epäsäännöllinen tai ei-suorakulmainen. Voit käyttää tätä muotoa vastaamaan tiiviisti hahmosi ääriviivoja. Kuperan monikulmion törmäysmuodon lisääminen:
# 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)
Valitsemalla sopivan törmäysmuodon ja kiinnittämällä sen pelaajahahmoon, voit tarkasti havaita törmäykset määrätyllä alueella, mikä parantaa pelin vuorovaikutuksen tarkkuutta maailman.
Törmäysten havaitseminen
Kohteiden välisten törmäysten havaitseminen on välttämätöntä vuorovaikutusten ja pelimekaniikan toteuttamiseksi. Godotissa voit saavuttaa tämän käyttämällä sisäänrakennettua fysiikkamoottoria.
# 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")
Alla on tulos:
Törmäyssignaalit ja törmäysnaamarit
Godot tarjoaa törmäyssignaaleja ja törmäysmaskeja tehokkaina työkaluina, jotka lisäävät pelisi hienostuneisuutta.
Törmäyssignaalit
Törmäyssignaalit ovat tapahtumia, jotka fysiikkamoottori laukaisee törmäysten sattuessa. Nämä signaalit tarjoavat kohteille tavan kommunikoida keskenään ja reagoida törmäyksiin. Godotissa voit muodostaa yhteyden törmäyssignaaleihin mukautetun logiikan suorittamiseksi, kun tiettyjä törmäystapahtumia tapahtuu.
Oletetaan esimerkiksi, että haluat soittaa äänitehosteen, kun pelaajahahmo törmää keräilyesineeseen. Näin voit saavuttaa tämän käyttämällä törmäyssignaaleja:
# 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()
Tässä esimerkissä body_entered signaali lähetetään, kun pelaajahahmo törmää toiseen fysiikan kappaleeseen. Kytkemällä tämän signaalin _on_body_entered -toiminnolla voit reagoida törmäystapahtumaan. Jos törmäävä kappale on sisällä kerättävä ryhmässä voit toistaa tekijänoikeusvapaata äänitehostetta.
Törmäysmaskit
Törmäysmaskien avulla voit hallita, mitkä törmäystasot voivat olla vuorovaikutuksessa toistensa kanssa. Jokainen törmäyskerros vastaa bittiä bittimaskissa. Määrittämällä kohteille törmäyskerroksia ja maskeja voit hienosäätää, mitkä kohteet törmäävät toisiinsa ja optimoida suorituskykyä.
Kuvittele esimerkiksi, että pelissäsi on vihollisia ja luoteja. Haluat vihollisten törmäävän alustojen kanssa, mutta ei toistensa kanssa. Haluat myös luotien törmäävän vihollisiin, mutta ei alustoihin. Näin voit saavuttaa tämän käyttämällä törmäysmaskeja:
# 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)
Ottamalla törmäysmaskit valikoivasti käyttöön tai poistamalla ne käytöstä, hallitset, mitkä kohteet voivat törmätä toisiinsa, mikä johtaa tarkkoihin ja tehokkaisiin törmäysvuorovaikutuksiin.
Parhaat käytännöt törmäysten havaitsemiseen
Harkitse näitä parhaita käytäntöjä varmistaaksesi sujuvan pelaamisen ja tehokkaan törmäysten havaitsemisen.
Käytä yksinkertaisia muotoja
Monimutkaiset törmäysmuodot voivat olla resurssivaltaisia. Käytä törmäysten havaitsemiseen aina kun mahdollista yksinkertaisia muotoja, kuten ympyröitä ja suorakulmioita.
Kerrosten törmäysmaskit
Godotin avulla voit määrittää törmäyskerroksia ja maskeja. Käytä näitä hallitaksesi, mitkä kohteet törmäävät toisiinsa, mikä optimoi suorituskykyä.
Esimerkiksi tasohyppelypelissä pelaaja voi hypätä alustoille ja liukua seiniä pitkin. Asettamalla törmäystasot ja maskit asianmukaisesti voit saavuttaa erilaisia käyttäytymismalleja.
Törmäysryhmät
Ryhmittele objektit, joilla on samanlaiset törmäysominaisuudet, helpottaaksesi hallintaa ja tehokasta törmäysten havaitsemista.
Rajoituslaatikot
Suorituskyvyn optimoimiseksi käytä rajausruutuja tarkistaaksesi nopeasti, ovatko kohteet lähellä, ennen kuin suoritat tarkan törmäyksen havaitsemisen.
Käytä kinemaattisia kyselyitä
Godot tarjoaa kinemaattisia kyselyitä törmäystarkistuksia varten ilman, että kohdetta siirretään. Tämä voi olla hyödyllistä ennakoitaessa törmäyksiä ennen kuin ne tapahtuvat.
Tee Godot-peleistä kiinnostavampia törmäystunnistuksen avulla
Tehokkaan törmäystunnistuksen sisällyttäminen Godot-peliisi ei ainoastaan takaa saumatonta vuorovaikutusta hahmojen ja ympäristön välillä, mutta se avaa myös mahdollisuuksia luovalle pelaamiselle mekaniikka.
Olipa kyseessä tasohyppelyhaasteet, pulmien ratkaiseminen tai taisteluskenaariot, törmäysten havaitseminen on pelaajien sitoutumisen ytimessä. Lisäämällä törmäystunnistuksen voit luoda pelin, joka valloittaa pelaajat sujuvalla ja dynaamisella vuorovaikutuksellaan.