Construye una torre
Lección 6 de 18 del curso Juego de Roblox: defensa de torres de Coddy.
Ahora, el lado del jugador. DefenseClient es un LocalScript dentro del HUD, un ScreenGui que Roblox copia en la pantalla de cada jugador. El marco Shop del HUD contiene un TextButton por torre, con el nombre de la torre. El evento Activated de un botón se dispara cuando se hace clic o se toca:
button.Activated:Connect(function()
selected = button.Name
end)Después, al hacer clic en una de las plataformas grises, se construye allí la torre elegida. El cliente lee el clic del ratón (me:GetMouse(), su evento Button1Down y su Target, la pieza que está bajo el puntero), pero no puede construir nada por sí mismo: las torres están en el servidor. Lo solicita a través del RemoteEvent Remotes.Place:
-- cliente
remotes.Place:FireServer(pad, "Archer")
-- servidor: Roblox añade primero al jugador
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
end)Los modelos de las torres esperan en ServerStorage.Towers; el servidor clona uno sobre la plataforma.
Desafío
IntermedioEn DefenseClient:
- Obtén
Players,Settings(conWaitForChild),local remotes = game.ReplicatedStorage:WaitForChild("Remotes"),local me = Players.LocalPlayerylocal hud = script.Parent. - Para cada TextButton en
hud.Shop, establece su texto con el nombre y el precio de la torre (Archer $60) y, al activarActivated, guárdala enselected. - Al pulsar
Button1Downdel ratón, si el objetivo está enworkspace.Padsy hay una torre seleccionada, activaremotes.Placecon la plataforma y el nombre de la torre.
En DefenseServer: añade local remotes y local towers = workspace.Towers, escribe placeTower(pad, kind) (clona, usa PivotTo para elevar el CFrame de la plataforma en la mitad de su altura más 1 y establece el elemento principal en towers) y conéctalo a remotes.Place.OnServerEvent.
Pulsa Play, elige una torre y haz clic en una plataforma. Después, pulsa 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)
-- Cada jugador recibe 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 desiste después de 8 segundos y lo indica
-- (MoveToFinished con false), así que se le vuelve a indicar a un enemigo lento que avance 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(Settings.Enemies[enemy.Name].Damage)
enemy:Destroy()
end
-- Un nuevo enemigo en la entrada, recorriendo el camino
local function spawnEnemy(kind)
local enemy = ServerStorage.Enemies[kind]:Clone()
-- colocado justo encima del primer punto de ruta
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
-- Una oleada: sus enemigos aparecen uno a uno; luego se espera hasta que desaparezcan todos
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
-- Las oleadas, cada una después de una pausa
for i, list in Settings.Waves do
task.wait(Settings.WaveBreak)
runWave(list)
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.