Menu
CoddyTech

Costruisci una torre

Lezione 6 di 18 del corso Gioco Roblox: Tower Defense di Coddy.

Ora il lato del giocatore. DefenseClient è un LocalScript all'interno dell'HUD, una ScreenGui che Roblox copia sullo schermo di ogni giocatore. Il frame Shop dell'HUD contiene un TextButton per ogni torre, con il nome della torre. L'evento Activated di un pulsante si attiva quando viene cliccato o toccato:

button.Activated:Connect(function()
	selected = button.Name
end)

Quindi, un clic su uno dei pad grigi costruisce lì la torre scelta. Il client rileva il clic dal mouse (me:GetMouse(), il suo evento Button1Down e il suo Target, la parte sotto il puntatore), ma non può costruire nulla da solo: le torri si trovano sul server. Lo richiede tramite il RemoteEvent Remotes.Place:

-- client
remotes.Place:FireServer(pad, "Archer")
-- server: Roblox aggiunge prima il giocatore
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
end)

I modelli delle torri aspettano in ServerStorage.Towers; il server ne clona uno sul pad.

challenge icon

Sfida

Medio

In DefenseClient:

  1. Ottieni Players, Settings (con WaitForChild), local remotes = game.ReplicatedStorage:WaitForChild("Remotes"), local me = Players.LocalPlayer e local hud = script.Parent.
  2. Per ogni TextButton in hud.Shop, imposta il testo sul nome e sul prezzo della torre (Archer $60) e, su Activated, memorizzala in selected.
  3. Al Button1Down del mouse, se il bersaglio si trova in workspace.Pads ed è selezionata una torre, attiva remotes.Place con il pad e il nome della torre.

In DefenseServer: aggiungi local remotes e local towers = workspace.Towers, scrivi placeTower(pad, kind) (clona, usa PivotTo sul CFrame del pad spostato verso l'alto di metà dell'altezza del pad più 1, imposta towers come genitore) e collegalo a remotes.Place.OnServerEvent.

Premi Play, scegli una torre e fai clic su un pad. Poi Check.

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 punti di passaggio, 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)
end

-- Fai percorrere il tracciato a un nemico. MoveTo rinuncia dopo 8 secondi e lo segnala
-- (MoveToFinished con false), quindi a un nemico lento viene dato di nuovo l'ordine 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 tracciato
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- posizionato appena sopra il primo punto di passaggio
	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: genera i suoi nemici uno alla volta, poi attendi che siano spariti tutti
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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Roblox: Tower Defense