Menu
CoddyTech

Tempatkan Menara

Pelajaran 8 dari 22 dalam kursus Game Roblox: Tower Defense di Coddy.

Satu klik pada salah satu alas abu-abu membangun menara yang dipilih di sana. Client membaca klik dari mouse: me:GetMouse(), event Button1Down-nya, dan Target-nya, yaitu bagian di bawah penunjuk. Namun, client tidak bisa membangun apa pun sendiri: menara berada di server. Client mengirim permintaan melalui RemoteEvent Remotes.Place:

-- client
remotes.Place:FireServer(workspace.Pads.Pad4, "Frost")
-- server: Roblox menambahkan player terlebih dahulu
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
end)

Model menara menunggu di ServerStorage.Towers; server menggandakan salah satunya ke atas alas, dengan posisi dinaikkan setinggi setengah tinggi alas ditambah 1 agar menara berdiri di atasnya.

challenge icon

Tantangan

Sedang

Bangun menara yang dipilih di atas alas yang kamu klik.

  1. Di DefenseClient, ambil remotes (dengan WaitForChild) dan me, yaitu LocalPlayer.
  2. Saat me:GetMouse().Button1Down ditekan, jika mouse.Target berada di workspace.Pads dan selected sudah diatur, panggil remotes.Place:FireServer(target, selected).
  3. Di DefenseServer, remotes.Place.OnServerEvent memanggil placeTower(pad, kind): klon ServerStorage.Towers[kind] ke atas alas, di workspace.Towers.

Tekan tombol “Main”, pilih Archer, lalu klik alas abu-abu: Archer akan berdiri di atasnya. Lalu tekan tombol “Periksa”.

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 secara berurutan (namanya 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

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

-- Setiap pemain mendapat Money di leaderboard
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)
	print("Base: " .. 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 itu mencapai markas
	damageBase(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Musuh baru di gerbang, 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))
	local info = Settings.Enemies[kind]
	enemy.Humanoid.MaxHealth = info.Health
	enemy.Humanoid.Health = info.Health
	enemy.Humanoid.WalkSpeed = info.Speed
	enemy.Parent = enemies
	task.spawn(walkPath, enemy)
	return enemy
end

-- Satu gelombang: munculkan musuh satu per satu, lalu tunggu sampai semuanya hilang
local function runWave(list)
	for _, kind in list do
		spawnEnemy(kind)
		task.wait(Settings.SpawnGap)
	end
	while #enemies:GetChildren() > 0 do
		task.wait(0.2)
	end
end

-- Gelombang-gelombang, masing-masing setelah jeda
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end

Semua pelajaran di Game Roblox: Tower Defense

Latihan sendiri: Playground Roblox