Menu
CoddyTech

Chegue à Base

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

Um inimigo que chega ao fim do caminho causa dano à base. A vida da base pertence ao servidor, mas será exibida na tela de todos os jogadores, então mantenha-a como um atributo do workspace: um atributo definido no servidor é visto por todos os clientes.

workspace:SetAttribute("BaseHealth", Settings.BaseHealth)
print(workspace:GetAttribute("BaseHealth")) --> 20

damageBase(amount) reduz esse valor, nunca abaixo de 0 (math.max), e o exibe, para que você possa acompanhar a base no Output até que o HUD a mostre. Depois do último ponto de passagem, o inimigo chama essa função e sai do jogo com Destroy; caso contrário, a onda nunca terminaria.

challenge icon

Desafio

Fácil

Cause dano à base quando um inimigo a alcançar.

  1. Depois de ordenar os pontos de referência, defina o atributo do workspace BaseHealth como Settings.BaseHealth.
  2. Escreva damageBase(amount): diminua BaseHealth em amount, nunca abaixo de 0, e print("Base: " .. health).
  3. No final de walkPath, chame damageBase(1) e destrua o inimigo.

Pressione “Jogar”: o Zombie caminha até a base e desaparece, e o Output mostra Base: 19. Depois, 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 (seus nomes são 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

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

-- Lição 4: Alcance a Base vai aqui

-- Faça um inimigo percorrer o caminho. MoveTo desiste após 8 segundos e avisa
-- (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
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))
	enemy.Parent = enemies
	task.spawn(walkPath, enemy)
	return enemy
end

-- Um inimigo, por enquanto
spawnEnemy("Zombie")

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

Pratique por conta própria: Playground de Roblox