Menu
CoddyTech

A Loja

Lição 7 de 22 do curso Jogo de Roblox: Defesa de Torres da Coddy.

Agora, o lado do jogador. DefenseClient é um LocalScript dentro do HUD, uma ScreenGui que o Roblox copia para a tela de cada jogador, então script.Parent é o HUD. O quadro Shop contém um TextButton para cada torre, nomeado de acordo com ela.

Um LocalScript pode iniciar antes que os objetos do jogo cheguem ao dispositivo do jogador, então ele os encontra com WaitForChild. O evento Activated de um botão é disparado quando ele é clicado ou tocado:

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

Desafio

Médio

Adicione os preços aos botões da loja em DefenseClient.

  1. Adicione local Settings = require(game.ReplicatedStorage:WaitForChild("Settings")) e local hud = script.Parent.
  2. Para cada TextButton em hud.Shop, defina o texto como button.Name .. " $" .. Settings.Towers[button.Name].Price.
  3. Quando ocorrer Activated, armazene o nome em local selected.

Pressione “Jogar”: a loja exibe Archer $60, Cannon $120 e Frost $90. Em seguida, pressione “Verificar”.

Experimente você mesmo

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

-- Os waypoints, em ordem (eles se chamam 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- A vida da base, como um atributo do workspace: todos os clientes podem lê-la
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Todo jogador recebe Money no leaderboard
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)

-- Um inimigo chegou à base
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
	print("Base: " .. health)
end

-- Faça um inimigo percorrer o caminho. MoveTo desiste após 8 segundos e sinaliza isso
-- (MoveToFinished com false), então um inimigo lento recebe o comando novamente até chegar.
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
	-- ele chegou à base
	damageBase(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Um novo inimigo no portão, percorrendo o caminho
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- posicionado logo acima do primeiro 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

-- Uma onda: seus inimigos, um por um; depois, espere até que todos tenham desaparecido
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

-- As ondas, cada uma após uma pausa
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end

Todas as lições de Jogo de Roblox: Defesa de Torres

Pratique por conta própria: Playground de Roblox