Menu
CoddyTech

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 = true

Boom 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.

challenge icon

Thử thách

Trung bình

Kết thúc trò chơi khi một tảng đá va vào tàu.

  1. Trong rock.gd, thêm signal hit_ship và phát tín hiệu này khi đối tượng là Ship.
  2. Trong main.gd, kết nối tín hiệu này trong spawn_rock vớ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 $Boom rồi tạm dừng trò chơi.
  3. 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
quiz iconTự kiểm tra

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

Tự luyện tập: Playground Godot