Ütő és labda létrehozása

A Godot Engine alapjai - II. Arkanoid
2021-06-17 · 01:55
Most, hogy elkészült a sablonunk, az előző tutorialhoz hasonlóan az ütőt és a labdát fogjuk létrehozni, de ezúttal kicsit más módszert fogunk alkalmazni.


Ütő létrehozása


Készítsünk egy új scene-t - Other Node -> KinematicBody2D - nevezzük el "Uto"-nek majd mentsük el. Adjunk hozzá egy CollishionShape2D-t, a Shape legyen Rectangle. Kattintsunk ismét a Rectangle-re és az extents - x értéke 128, az y pedig 16 legyen. Adjunk az Uto-höz egy Sprite-ot is. A jobb oldali panelen, a Texture mezőbe töltsük be az alábbi képet:

uto


Adjunk az Uto-höz egy Position2D node-ot is, és állítsuk a Position - y értékét 128-ra. Végül adjunk az Uto-höz egy script-et, hogy használni is tudjuk:

extends KinematicBody2D

# a CollishionShape2D extents x értékéből megkapjuk az ütő szélességének a felét
onready var fel_uto = $CollisionShape2D.shape.extents.x

func _physics_process(delta):
    # clamp(érték, minimum, maximum)
    # a pozíció x értékét egyenlővé tesszük az egér x koordinátájával
    # ha az a játékterületen belül van
    # mivel az ütő origója középen van, ezért ki kell vonni,
    # illetve hozzá kell adni a fél ütő hosszát az egyenlethez
    position.x = clamp(get_global_mouse_position().x, 240 + fel_uto, 1040 - fel_uto)

Így már követni fogja az egér mozgását. Mentsük el, majd nyissuk meg a PalyaSablon-t, és adjuk hozzá az ütőt - jobb klikk a root node-on, majd Instance Child Scene. Állítsuk a Position - x és y értékét is 640-re. A PalyaSablon scene-en [F6]-ot nyomva, rögtön ki is próbálhatjuk.


Labda létrehozása


Hozzunk létre megint egy új scene-t, ami ezúttal RigidBody2D legyen. Nevezzük el "Labda"-nak és mentsük el, majd módosítsük az értékeit az alábbiak szerint:
a labda beállításai


Adjunk neki egy CollisionShape2D-t, de ezúttal a CircleShape-et válasszuk. Kattintsunk rá ismét, és adjunk meg 16-ot a radius értékének.

Adjunk a Labda-hoz is egy Sprite-ot és a Texture mezőjébe tallózzuk be a már korábban használt labda sprite-ot. A scale - x és y értékét állítsuk 0.5-re.

Adjunk a Labda-hoz is egy script-et, majd kattintsunk ismét a Labda node-ra és jobb oldalon a Node fülön adjunk hozzá egy body_entered() signal-t, majd egészítsük ki a kódot így:

extends RigidBody2D

# a labda gyorsulása
const GYORSULAS = 4
# a labda maximális sebessége
const MAX_SEBESSEG = 800

func _ready():
    # a labda elhelyezése
    position = Vector2(640, 580)


# bevitel (event) figyelése
func _input(event):
    # ha ez az "event" egy egérgomb
    if event is InputEventMouseButton:
        # ha ez az egérgomb meg lett nyomva és ez a bal egérgomb
        if event.pressed && event.button_index == BUTTON_LEFT:
            # a labda kilövése
            # linear_velocity: a labda sebességvektora
            # a sebesség nagyságát és irányát adja meg
            linear_velocity = Vector2(0, -600)
	

# ha a labda ütközött valamivel (body)
func _on_Labda_body_entered(body):
    # ha ez a "body" az ütő volt
    if body.get_name() == "Uto":
        # lekérjük a sebesség vektor hosszát
        var sebesseg = linear_velocity.length()
        # az irányt úgy kapjuk meg, hogy a labda pozíciójábol kivonjuk
        # az ütő alatt lévő Position2D pozícióját
        var irany = position - body.get_node("Position2D").global_position
        # vegül ezekkel az értékekkel frissítjük a sebességvektort
        # az irányból normálvektort hozunk létre
        # majd ezt beszorozzuk a sebesseg + GYORSULÁS és a MAX_SEBESSÉG küzül
        # a kisebb értékkel
        linear_velocity = irany.normalized() * min(sebesseg + GYORSULAS, MAX_SEBESSEG)


func _physics_process(delta):
    # ha a labda y pozíciója lejjebb van, mint a pálya alja
    if position.y > 720:
        # törlődjön
        queue_free()


# törlés után ezt hajtja végre
func _exit_tree():
    # hívja a "labda_letrehozasa" függvényt a parent node-ján
    # így egy új labda jön létre és kezdődhet minden elölről
    get_parent().labda_letrehozasa()

Elkészült a labdánk alapja, a későbbiekben még bővíteni fogjuk a kódját, de egyelőre csak mentsük el. Az előző játékhoz hasonlóan megint kódból fogjuk hozzáadni a labdát a pályához.

Nyissuk meg ismét a PalyaSablon-t és adjunk hozzá is egy script-et, a kód ugyanaz, mint a másik játéknál volt:

extends Node2D

# létrehozunk egy hivatkozás a labda fájlra
var labda_scene = preload("res://Labda.tscn")


func _ready():
    #létrehozunk egy példányt a labdából
    var Labda = labda_scene.instance()
    # megvárjuk az aktuális művelet befejezését, majd létrehozzuk a labdát
    call_deferred("add_child", Labda)