Menu
CoddyTech

La tienda

Lección 7 de 22 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, así que script.Parent es el HUD. Su marco Shop contiene un TextButton por torre, con el nombre de la torre.

Un LocalScript puede iniciarse antes de que los objetos del juego lleguen al dispositivo del jugador, así que los busca con WaitForChild. El evento Activated de un botón se activa cuando se hace clic en él o se toca:

local Settings = require(game.ReplicatedStorage:WaitForChild("Settings"))
local button = script.Parent.Shop.Frost
button.Text = "Frost tower"
button.Activated:Connect(function()
	print("Frost picked")
end)
challenge icon

Desafío

Intermedio

Pon los precios en los botones de la tienda en DefenseClient.

  1. Añade local Settings = require(game.ReplicatedStorage:WaitForChild("Settings")) y local hud = script.Parent.
  2. Para cada TextButton en hud.Shop, establece su texto en button.Name .. " $" .. Settings.Towers[button.Name].Price.
  3. Al activarlo con Activated, guarda su nombre en local selected.

Pulsa «Jugar»: la tienda muestra Archer $60, Cannon $120 y Frost $90. Después, pulsa «Comprobar».

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 consultarla
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)
	print("Base: " .. health)
end

-- Haz que un enemigo recorra el camino. MoveTo deja de intentarlo 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(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Un nuevo enemigo en la entrada que recorre 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 por uno; después, se espera hasta que no quede ninguno
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

Todas las lecciones de Juego de Roblox: Defensa de torres

Practica por tu cuenta: Playground de Roblox