قسّم الصخور
جزء من قسم المشاريع في رحلة Godot على Coddy. الدرس 16 من 33.
ينبغي أن تنقسم الصخرة الكبيرة إلى صخرتين صغيرتين. أعطِ كل صخرة قيمة size، بحيث تكون 2 للصخرة الكبيرة و1 للصغيرة. في _ready ضمن rock.gd، عيّن scale = Vector2.ONE * size * 0.5.
تُعلن الصخرة عن انكسارها باستخدام signal broken(rock) وbroken.emit(self). تشير self إلى الصخرة. أصبحت spawn_rock تستقبل الآن الحجم وتربط الإشارة:
func _on_rock_broken(rock):
if rock.size == 2:
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5, 1)
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5, 1)تصل الإشارة بينما يتحقق Godot من المناطق المتلامسة. تؤدي إضافة منطقة حينها إلى إيقاف اللعبة مع ظهور الرسالة لا يمكن تغيير هذه الحالة أثناء تفريغ الاستعلامات. تنفّذ call_deferred الاستدعاء في نهاية الإطار، حين يكون ذلك آمنًا.
التحدي
صعب- في
rock.gd، أضفvar size = 2وsignal broken(rock). اضبط المقياس انطلاقًا منsizeفي_ready. أرسل الإشارةbrokenمعselfعندما تصيب رصاصة الصخرة. - في
main.gd، اجعلspawn_rock(where, velocity, size)يضبطsizeللصخرة ويربط إشارتهاbroken. يكون حجم الصخور الأربع الأولى 2. - عندما تتحطم صخرة حجمها 2، أنشئ هناك صخرتين حجمهما 1 باستخدام
call_deferred. تكون سرعاتهما هي السرعة القديمة بعد تدويرها بمقدار0.8و-0.8، ثم ضربها في1.5.
جرّب بنفسك
extends Node2D
const ROCK = preload("res://rock.tscn")
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)))
func spawn_rock(where, velocity):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
add_child(rock)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
2مشروع: مطلق النار على الكويكبات
أدر السفينةأشعل المحركتدرّب بنفسك: Playground لـ Godot