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.
Desafío
Fácil- Escribe
runWave(list): genera cada enemigo de la lista, esperandoSettings.SpawnGapdespués de cada uno; luego espera hasta queenemiesno tenga hijos. - Reemplaza la generación individual por un bucle sobre
Settings.Waves: esperaSettings.WaveBreaky 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")
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.