Fale
Lekcja 4 z 18 w kursie Gra Roblox: Obrona wieży w Coddy.
Jeden zombie to jeszcze nie gra. Settings.Waves zawiera listę fal, z których każda jest listą nazw przeciwników:
Waves = {
{ "Zombie", "Zombie", "Zombie" },
{ "Zombie", "Runner" },
}runWave(list) tworzy przeciwników po kolei, w odstępach co Settings.SpawnGap sekund, a następnie czeka, aż workspace.Enemies będzie puste, więc następna fala rozpoczyna się dopiero po zakończeniu tej. Przed każdą falą gracze mają Settings.WaveBreak sekund na przygotowanie się.
Główna pętla przechodzi kolejno przez fale: for i, list in Settings.Waves do.
Wyzwanie
Łatwy- Napisz
runWave(list): utwórz każdego przeciwnika z listy, odczekującSettings.SpawnGappo każdym z nich, a następnie poczekaj, ażenemiesnie będzie mieć dzieci. - Zastąp pojedyncze tworzenie przeciwnika pętlą po
Settings.Waves: odczekajSettings.WaveBreak, a następnie uruchom falę.
Świat w tej lekcji ma dwie krótkie fale. Naciśnij Play, a następnie Check.
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 (mają nazwy 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)
end
-- Poprowadź wroga wzdłuż trasy. MoveTo rezygnuje po 8 sekundach i sygnalizuje to
-- (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(1)
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))
enemy.Parent = enemies
task.spawn(walkPath, enemy)
return enemy
end
-- Na razie jeden wróg
spawnEnemy("Zombie")
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.