Menu
CoddyTech

Các đợt tấn công

Bài học 5 trên 22 trong khóa học Trò chơi Roblox: phòng thủ tháp của Coddy.

Một zombie thì không tạo nên trò chơi. Settings.Waves liệt kê các đợt, mỗi đợt là một danh sách tên kẻ địch:

Waves = {
	{ "Zombie", "Zombie", "Zombie" },
	{ "Zombie", "Runner" },
}

runWave(list) tạo từng kẻ địch theo thứ tự, cách nhau Settings.SpawnGap giây, rồi chờ đến khi workspace.Enemies trống. Vì vậy, đợt tiếp theo chỉ bắt đầu khi đợt này kết thúc. Trước mỗi đợt, người chơi có Settings.WaveBreak giây để chuẩn bị.

Vòng lặp chính duyệt các đợt theo thứ tự: for i, list in Settings.Waves do.

challenge icon

Thử thách

Dễ

Cho kẻ địch xuất hiện theo từng đợt.

  1. Viết runWave(list): tạo từng kẻ địch trong danh sách, chờ Settings.SpawnGap sau mỗi lần, rồi chờ đến khi enemies không còn con nào.
  2. Thay lần tạo kẻ địch đơn lẻ bằng for i, list in Settings.Waves do: chờ Settings.WaveBreak, rồi gọi runWave(list).

Nhấn Chơi: sau 6 giây, năm Zombie xuất hiện, mỗi con cách nhau một giây, rồi có thêm những con khác. Sau đó, nhấn Kiểm tra.

Tự làm thử

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local enemies = workspace.Enemies

print("The base can take " .. Settings.BaseHealth .. " hits")

-- Các điểm mốc (waypoint) theo thứ tự (được đặt tên 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- Máu của căn cứ là một thuộc tính (attribute) của workspace: mọi client đều có thể đọc
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Mỗi người chơi đều nhận Money trên bảng xếp hạng
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local money = Instance.new("IntValue")
	money.Name = "Money"
	money.Value = Settings.StartMoney
	money.Parent = leaderstats
end)

-- Một kẻ địch đã đến căn cứ
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
	print("Base: " .. health)
end

-- Cho kẻ địch đi theo đường. MoveTo dừng sau 8 giây và báo lại
-- (MoveToFinished trả về false), nên tiếp tục ra lệnh cho kẻ địch chậm di chuyển đến khi nó tới nơi.
local function walkPath(enemy)
	local humanoid = enemy.Humanoid
	for i = 2, #waypoints do
		repeat
			humanoid:MoveTo(waypoints[i].Position)
		until humanoid.MoveToFinished:Wait() or not enemy.Parent
		if not enemy.Parent then
			return
		end
	end
	-- Nó đã đến căn cứ
	damageBase(1)
	enemy:Destroy()
end

-- Một kẻ địch mới xuất hiện ở cổng và đi theo đường
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- Xuất hiện ngay phía trên điểm mốc đầu tiên
	enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
	enemy.Parent = enemies
	task.spawn(walkPath, enemy)
	return enemy
end

-- Bài học 5: Thêm các đợt tấn công vào đây

-- Hiện tại chỉ có một kẻ địch
spawnEnemy("Zombie")

Tất cả bài học trong Trò chơi Roblox: phòng thủ tháp

Tự luyện tập: Playground Roblox