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)Desafio
MédioAdicione os preços aos botões da loja em DefenseClient.
- Adicione
local Settings = require(game.ReplicatedStorage:WaitForChild("Settings"))elocal hud = script.Parent. - Para cada TextButton em
hud.Shop, defina o texto comobutton.Name .. " $" .. Settings.Towers[button.Name].Price. - Quando ocorrer
Activated, armazene o nome emlocal 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