Menu
CoddyTech

Il negozio

Lezione 7 di 22 del corso Gioco Roblox: Tower Defense di Coddy.

Ora il lato del giocatore. DefenseClient è un LocalScript all'interno di HUD, una ScreenGui che Roblox copia sullo schermo di ogni giocatore, quindi script.Parent è HUD. Il suo riquadro Shop contiene un TextButton per ogni torre, che porta il nome della torre.

Un LocalScript può avviarsi prima che gli oggetti del gioco arrivino sul dispositivo del giocatore, quindi li trova con WaitForChild. L'evento Activated di un pulsante si attiva quando viene cliccato o toccato:

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

Sfida

Medio

Inserisci i prezzi sui pulsanti del negozio in DefenseClient.

  1. Aggiungi local Settings = require(game.ReplicatedStorage:WaitForChild("Settings")) e local hud = script.Parent.
  2. Per ogni TextButton in hud.Shop, imposta il testo su button.Name .. " $" .. Settings.Towers[button.Name].Price.
  3. Quando viene attivato con Activated, memorizza il suo nome in local selected.

Premi «Gioca»: il negozio mostra Archer $60, Cannon $120 e Frost $90. Poi premi «Verifica».

Provalo tu

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

-- I waypoint, in ordine (si chiamano 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- La salute della base, come attributo di workspace: ogni client può leggerla
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Ogni giocatore riceve Money nella classifica
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 nemico ha raggiunto la base
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
	print("Base: " .. health)
end

-- Fai avanzare un nemico lungo il percorso. MoveTo rinuncia dopo 8 secondi e lo segnala
-- (MoveToFinished con false), quindi il comando viene ripetuto per un nemico lento finché non arriva.
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
	-- ha raggiunto la base
	damageBase(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Un nuovo nemico al cancello, che percorre il tragitto
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- posizionato appena sopra il primo waypoint
	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

-- Un'ondata: i suoi nemici uno alla volta, poi attendi che siano tutti scomparsi
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

-- Le ondate, ciascuna dopo una pausa
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end

Tutte le lezioni di Gioco Roblox: Tower Defense

Esercitati da solo: Playground Roblox