Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy
  1. Napisz runWave(list): utwórz każdego przeciwnika z listy, odczekując Settings.SpawnGap po każdym z nich, a następnie poczekaj, aż enemies nie będzie mieć dzieci.
  2. Zastąp pojedyncze tworzenie przeciwnika pętlą po Settings.Waves: odczekaj Settings.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")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Roblox: Obrona wieży