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:
Adjunk az Uto-höz egy Position2Dnode-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 PalyaSablonscene-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:
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)