Menu
CoddyTech

Gelombang

Pelajaran 4 dari 18 dalam kursus Game Roblox: Tower Defense di Coddy.

Satu zombie saja bukan permainan. Settings.Waves berisi daftar wave, masing-masing berupa daftar nama musuh:

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

runWave(list) memunculkan musuh satu per satu, dengan jeda Settings.SpawnGap detik, lalu menunggu sampai workspace.Enemies kosong, sehingga wave berikutnya hanya dimulai setelah wave ini selesai. Sebelum setiap wave, pemain mendapat waktu Settings.WaveBreak detik untuk bersiap.

Perulangan utama menelusuri wave secara berurutan: for i, list in Settings.Waves do.

challenge icon

Tantangan

Mudah
  1. Tulis runWave(list): munculkan setiap musuh dalam list, tunggu Settings.SpawnGap setelah setiap musuh, lalu tunggu hingga enemies tidak memiliki anak.
  2. Ganti kemunculan tunggal dengan perulangan pada Settings.Waves: tunggu Settings.WaveBreak, lalu jalankan wave.

World dalam pelajaran ini memiliki dua wave singkat. Tekan Play, lalu Check.

Coba sendiri

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")

-- Waypoint sesuai urutan (dinamai 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- Nyawa markas sebagai atribut workspace: setiap client dapat membacanya
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Setiap pemain mendapat Money di papan peringkat
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)

-- Musuh mencapai markas
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
end

-- Gerakkan musuh menyusuri jalur. MoveTo berhenti mencoba setelah 8 detik dan memberi tahu
-- (MoveToFinished dengan false), jadi musuh yang lambat digerakkan lagi sampai tiba.
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
	-- Musuh mencapai markas
	damageBase(1)
	enemy:Destroy()
end

-- Musuh baru di gerbang, berjalan menyusuri jalur
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- Ditempatkan tepat di atas waypoint pertama
	enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
	enemy.Parent = enemies
	task.spawn(walkPath, enemy)
	return enemy
end

-- Satu musuh untuk saat ini
spawnEnemy("Zombie")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Roblox: Tower Defense

Latihan sendiri: Playground Roblox