Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

En DefenseClient:

  1. Obtén Players, Settings (con WaitForChild), local remotes = game.ReplicatedStorage:WaitForChild("Remotes"), local me = Players.LocalPlayer y local hud = script.Parent.
  2. Para cada TextButton en hud.Shop, establece su texto con el nombre y el precio de la torre (Archer $60) y, al activar Activated, guárdala en selected.
  3. Al pulsar Button1Down del ratón, si el objetivo está en workspace.Pads y hay una torre seleccionada, activa remotes.Place con 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
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