Va chạm và chơi lại
Thuộc phần Dự án trong hành trình Godot của Coddy. Bài học 21 trên 36.
Tàu bay xuyên qua những tảng đá. Một tảng đá chạm vào tàu sẽ kết thúc trò chơi. Trong rock.gd, ở _on_body_entered, tàu là phần thân có tên Ship. Tảng đá phát tín hiệu hit_ship. main.gd kết nối tín hiệu đó trong spawn_rock rồi kết thúc trò chơi:
func _on_hit_ship():
$HUD/Message.text = "Game Over"
$Ship.hide()
$Boom.position = $Ship.position
$Boom.emitting = true
get_tree().paused = trueBoom là một CPUParticles2D chỉ chạy một lần. Đặt emitting thành true để nó phát hạt một lần. Nó là con của Main, có chế độ Always, nên vẫn chạy khi trò chơi tạm dừng.
Cuối cùng, cho phép nhấn Enter để bắt đầu trò chơi mới khi đang tạm dừng, như trong Breakout: bỏ tạm dừng, rồi gọi reload_current_scene(). Cách này cũng hoạt động sau khi thắng.
Thử thách
Trung bìnhKết thúc trò chơi khi một tảng đá va vào tàu.
- Trong
rock.gd, thêmsignal hit_shipvà phát tín hiệu này khi đối tượng làShip. - Trong
main.gd, kết nối tín hiệu này trongspawn_rockvới_on_hit_ship. Hàm này hiển thịGame Over, ẩn tàu, tạo hiệu ứng nổ tại vị trí của tàu bằng$Boomrồi tạm dừng trò chơi. - Khi trò chơi tạm dừng, nhấn Enter để tiếp tục và tải lại cảnh.
Nhấn Chơi rồi lái tàu va vào một tảng đá: tàu sẽ phát nổ. Sau đó nhấn Kiểm tra.
Tự làm thử
extends Node2D
const ROCK = preload("res://rock.tscn")
var score = 0
var rocks_left = 4
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)), 2)
$HUD/Score.text = "Score: 0"
func spawn_rock(where, velocity, size):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
rock.size = size
rock.broken.connect(_on_rock_broken)
add_child(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)
score += 20
rocks_left += 2
else:
score += 50
rocks_left -= 1
$HUD/Score.text = "Score: %d" % score
if rocks_left == 0:
$HUD/Message.text = "You win!"
get_tree().paused = true
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Dự án
1Dự án: Breakout
Thanh đỡ trong BreakoutGiữ thanh đỡ trong màn hình4Dự án: trò chơi khám phá hầm ngục
Khám phá hầm ngụcNhặt chìa khóa2Dự án: Trò chơi bắn thiên thạch
Xoay con tàuKhởi động động cơTự luyện tập: Playground Godot