Menu
CoddyTech

Toko

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

Sekarang, sisi pemain. DefenseClient adalah LocalScript di dalam HUD, sebuah ScreenGui yang disalin Roblox ke layar setiap pemain, jadi script.Parent adalah HUD. Frame Shop berisi satu TextButton untuk setiap menara, yang namanya sesuai dengan nama menara tersebut.

LocalScript dapat berjalan sebelum objek game sampai di perangkat pemain, jadi script ini menemukannya dengan WaitForChild. Event Activated pada tombol terpanggil saat tombol diklik atau diketuk:

local Settings = require(game.ReplicatedStorage:WaitForChild("Settings"))
local button = script.Parent.Shop.Frost
button.Text = "Frost tower"
button.Activated:Connect(function()
	print("Frost picked")
end)
challenge icon

Tantangan

Sedang

Tambahkan harga pada tombol toko di DefenseClient.

  1. Tambahkan local Settings = require(game.ReplicatedStorage:WaitForChild("Settings")) dan local hud = script.Parent.
  2. Untuk setiap TextButton di hud.Shop, atur teksnya menjadi button.Name .. " $" .. Settings.Towers[button.Name].Price.
  3. Saat tombol diaktifkan melalui Activated, simpan namanya di local selected.

Tekan tombol “Main”: toko menampilkan Archer $60, Cannon $120, dan Frost $90. 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 (bernama 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 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 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 musuhnya 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