Menu
CoddyTech

Sklep

Lekcja 7 z 22 w kursie Gra Roblox: Obrona wieży w Coddy.

Teraz strona gracza. DefenseClient to LocalScript umieszczony w HUD, obiekcie ScreenGui, który Roblox kopiuje na ekran każdego gracza, więc script.Parent to HUD. Ramka Shop zawiera po jednym obiekcie TextButton dla każdej wieży, nazwanym tak jak ona.

LocalScript może uruchomić się, zanim obiekty gry dotrą na urządzenie gracza, dlatego wyszukuje je za pomocą WaitForChild. Zdarzenie Activated przycisku jest wywoływane po kliknięciu lub dotknięciu:

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

Wyzwanie

Średni

Umieść ceny na przyciskach sklepu w DefenseClient.

  1. Dodaj local Settings = require(game.ReplicatedStorage:WaitForChild("Settings")) i local hud = script.Parent.
  2. Dla każdego TextButton w hud.Shop ustaw jego tekst na button.Name .. " $" .. Settings.Towers[button.Name].Price.
  3. Po jego Activated zapisz jego nazwę w local selected.

Naciśnij „Graj”: w sklepie wyświetlą się Archer $60, Cannon $120 i Frost $90. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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

-- Punkty trasy w kolejności (nazywają się 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- Zdrowie bazy jako atrybut workspace: każdy klient może je odczytać
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Każdy gracz otrzymuje Money w tabeli wyników
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)

-- Wróg dotarł do bazy
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
	print("Base: " .. health)
end

-- Poprowadź wroga wzdłuż trasy. MoveTo przerywa próbę po 8 sekundach i to sygnalizuje
-- (MoveToFinished z wartością false), więc powolny wróg jest kierowany do celu ponownie, aż tam dotrze.
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
	-- dotarł do bazy
	damageBase(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Nowy wróg przy bramie, podążający trasą
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- umieszczony tuż nad pierwszym punktem trasy
	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

-- Jedna fala: jej wrogowie pojawiają się kolejno, a potem czekamy, aż wszyscy znikną
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

-- Fale, każda po przerwie
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end

Wszystkie lekcje w sekcji Gra Roblox: Obrona wieży

Poćwicz samodzielnie: Edytor online Roblox