Menu
CoddyTech

قسّم الصخور

جزء من قسم المشاريع في رحلة Godot على Coddy. الدرس 18 من 36.

ينبغي أن تنقسم الصخرة التي تصيبها الطلقة إلى قسمين. تُبلّغ الصخرة عن انكسارها باستخدام signal broken(rock) وbroken.emit(self). تشير self إلى الصخرة، لذا يعرف المستمع مكانها وكيف تحركت.

تربط spawn_rock كل صخرة جديدة باستخدام rock.broken.connect(_on_rock_broken)، وتُنشئ تلك الدالة صخرتين تتجهان في اتجاهين متباعدين:

func _on_rock_broken(rock):
	spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5)
	spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5)

تصل الإشارة بينما يتحقق Godot من المناطق المتلامسة. تؤدي إضافة منطقة عندئذٍ إلى إيقاف اللعبة مع ظهور الرسالة Can't change this state while flushing queries. تنفّذ call_deferred الاستدعاء في نهاية الإطار، حين يكون ذلك آمنًا.

في الوقت الحالي، تنقسم كل صخرة، لذا لا تنفد الصخور أبدًا. سنتناول الأحجام لاحقًا.

challenge icon

التحدي

صعب

اجعل الصخور التي تُصاب تنقسم إلى قسمين.

  1. في rock.gd، أضف signal broken(rock) واستدعِ broken.emit(self) عندما تصيب رصاصةٌ صخرةً، قبل queue_free().
  2. في main.gd، اربط broken لكل صخرة بالدالة _on_rock_broken داخل spawn_rock.
  3. في _on_rock_broken(rock)، أنشئ صخرتين كما هو موضح، باستخدام call_deferred.

اضغط على «العب» وأطلق النار على صخرة: ستطير صخرتان مبتعدتين إحداهما عن الأخرى. ثم اضغط على «تحقق».

جرّب بنفسك

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)

جميع دروس المشاريع

تدرّب بنفسك: Playground لـ Godot