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)Wyzwanie
ŚredniUmieść ceny na przyciskach sklepu w DefenseClient.
- Dodaj
local Settings = require(game.ReplicatedStorage:WaitForChild("Settings"))ilocal hud = script.Parent. - Dla każdego TextButton w
hud.Shopustaw jego tekst nabutton.Name .. " $" .. Settings.Towers[button.Name].Price. - Po jego
Activatedzapisz jego nazwę wlocal 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