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.
Thử thách
DễCho kẻ địch xuất hiện theo từng đợt.
- Viết
runWave(list): tạo từng kẻ địch trong danh sách, chờSettings.SpawnGapsau mỗi lần, rồi chờ đến khienemieskhông còn con nào. - Thay lần tạo kẻ địch đơn lẻ bằng
for i, list in Settings.Waves do: chờSettings.WaveBreak, rồi gọirunWave(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