Menu
CoddyTech

Chia nhỏ các tảng đá

Thuộc phần Dự án trong hành trình Godot của Coddy. Bài học 18 trên 36.

Một tảng đá trúng đạn sẽ tách làm đôi. Tảng đá báo rằng nó đã vỡ bằng signal broken(rock) và broken.emit(self). self là tảng đá, nên bộ lắng nghe biết nó ở đâu và di chuyển như thế nào.

spawn_rock kết nối mỗi tảng đá mới với rock.broken.connect(_on_rock_broken), và hàm đó tạo ra hai tảng đá bay theo hai hướng khác nhau:

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)

Tín hiệu được gửi đến khi Godot đang kiểm tra những vùng nào chạm nhau. Thêm một vùng vào lúc đó sẽ khiến trò chơi dừng lại với thông báo Can't change this state while flushing queries. call_deferred gọi hàm vào cuối khung hình, khi việc đó an toàn.

Hiện tại, mọi tảng đá đều tách đôi nên chúng không bao giờ cạn. Tiếp theo là kích thước.

challenge icon

Thử thách

Khó

Khi bắn trúng, hãy làm đá tách thành hai mảnh.

  1. Trong rock.gd, thêm signal broken(rock) và gọi broken.emit(self) khi một viên đạn va trúng, trước queue_free().
  2. Trong main.gd, kết nối tín hiệu broken của từng tảng đá với _on_rock_broken trong spawn_rock.
  3. Trong _on_rock_broken(rock), tạo hai tảng đá như minh họa bằng call_deferred.

Nhấn Chơi rồi bắn một tảng đá: hai tảng đá bay tách ra. Sau đó, nhấn Kiểm tra.

Tự làm thử

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)

Tất cả bài học trong Dự án

Tự luyện tập: Playground Godot