Menu
CoddyTech

Posiziona una torre

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

Un clic su una delle piastre grigie costruisce lì la torre scelta. Il client rileva il clic del 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(workspace.Pads.Pad4, "Frost")
-- 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 crea una copia sulla piastra, sollevata di metà dell’altezza della piastra più 1, in modo che poggi sopra.

challenge icon

Sfida

Medio

Costruisci la torre selezionata sulla piazzola che clicchi.

  1. In DefenseClient, ottieni remotes (con WaitForChild) e me, il LocalPlayer.
  2. Su me:GetMouse().Button1Down, se mouse.Target si trova in workspace.Pads e selected è impostato, chiama remotes.Place:FireServer(target, selected).
  3. In DefenseServer, remotes.Place.OnServerEvent chiama placeTower(pad, kind): clona ServerStorage.Towers[kind] sulla piazzola, in workspace.Towers.

Premi «Gioca», seleziona Archer e fai clic su una piazzola grigia: un Archer vi apparirà. 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 un nemico lento viene fatto avanzare di nuovo 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 percorso
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 finché non se ne sono andati 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

Tutte le lezioni di Gioco Roblox: Tower Defense

Esercitati da solo: Playground Roblox