Menu
CoddyTech

Oleadas

Lección 4 de 18 del curso Juego de Roblox: defensa de torres de Coddy.

Un zombi no es un juego. Settings.Waves enumera las oleadas, cada una como una lista de nombres de enemigos:

Waves = {
	{ "Zombie", "Zombie", "Zombie" },
	{ "Zombie", "Runner" },
}

runWave(list) genera a sus enemigos uno por uno, con Settings.SpawnGap segundos de separación, y después espera hasta que workspace.Enemies esté vacío, así que la siguiente oleada empieza solo cuando esta termina. Antes de cada oleada, los jugadores tienen Settings.WaveBreak segundos para prepararse.

El bucle principal recorre las oleadas en orden: for i, list in Settings.Waves do.

challenge icon

Desafío

Fácil
  1. Escribe runWave(list): genera cada enemigo de la lista, esperando Settings.SpawnGap después de cada uno; luego espera hasta que enemies no tenga hijos.
  2. Reemplaza la generación individual por un bucle sobre Settings.Waves: espera Settings.WaveBreak y después ejecuta la oleada.

El mundo de esta lección tiene dos oleadas cortas. Pulsa Play y después Check.

Pruébalo tú mismo

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

-- Los puntos de ruta, en orden (se llaman 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- La salud de la base, como atributo de workspace: todos los clientes pueden leerla
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Todos los jugadores reciben Money en la tabla de clasificación
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)

-- Un enemigo llegó a la base
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
end

-- Haz que un enemigo recorra el camino. MoveTo se rinde después de 8 segundos y lo indica
-- (MoveToFinished con false), así que se vuelve a enviar al enemigo lento hasta que llegue.
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
	-- llegó a la base
	damageBase(1)
	enemy:Destroy()
end

-- Un nuevo enemigo en la entrada, recorriendo el camino
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- se coloca justo encima del primer punto de ruta
	enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
	enemy.Parent = enemies
	task.spawn(walkPath, enemy)
	return enemy
end

-- Un solo enemigo, por ahora
spawnEnemy("Zombie")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Roblox: defensa de torres