Menu
CoddyTech

Tảng đá lớn và nhỏ

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

Chỉ đá lớn mới được tách ra. Gán cho mỗi hòn đá size, giá trị 2 cho đá lớn và 1 cho đá nhỏ, rồi dùng giá trị đó để vẽ trong rock.gd's _ready: scale = Vector2.ONE * size * 0.5.

spawn_rock cũng nhận kích thước. Đặt rock.size trước add_child(rock): _ready chạy bên trong add_child, nên đặt kích thước sau đó sẽ quá muộn để thay đổi tỷ lệ.

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)

Đá nhỏ chỉ vỡ ra.

challenge icon

Thử thách

Khó

Khiến đá lớn tách ra và đá nhỏ vỡ.

  1. Trong rock.gd, thêm var size = 2 và đặt scale = Vector2.ONE * size * 0.5 trong _ready.
  2. Thêm tham số size cho spawn_rock và đặt rock.size trước add_child. 4 viên đầu tiên có 2.
  3. Chỉ tách khi rock.size == 2, thành hai viên cỡ 1.

Nhấn Chơi rồi bắn: đá lớn tách ra, đá nhỏ vỡ. 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
	rock.broken.connect(_on_rock_broken)
	add_child(rock)

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ất cả bài học trong Dự án

Tự luyện tập: Playground Godot