Menu
CoddyTech

Dükkân

Coddy'nin Roblox Oyunu: Kule Savunması kursunda ders 7 / 22.

Şimdi oyuncu tarafına bakalım. DefenseClient, HUD içindeki bir LocalScript'tir. HUD, Roblox'un her oyuncunun ekranına kopyaladığı bir ScreenGui olduğundan script.Parent HUD'dur. Shop çerçevesinde her kule için, kulenin adını taşıyan bir TextButton bulunur.

LocalScript, oyunun nesneleri oyuncunun cihazına ulaşmadan önce çalışmaya başlayabilir; bu yüzden bunları WaitForChild ile bulur. Bir düğmenin Activated olayı, tıklandığında veya dokunulduğunda tetiklenir:

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

Görev

Orta

DefenseClient içindeki dükkân düğmelerine fiyatları ekle.

  1. local Settings = require(game.ReplicatedStorage:WaitForChild("Settings")) ve local hud = script.Parent satırlarını ekle.
  2. hud.Shop içindeki her TextButton için, metnini button.Name .. " $" .. Settings.Towers[button.Name].Price olarak ayarla.
  3. Activated olduğunda, adını local selected içinde sakla.

“Oyna” düğmesine bas: dükkânda Archer $60, Cannon $120 ve Frost $90 görünür. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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

-- Sıralı yol noktaları (1, 2, 3... olarak adlandırılırlar)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- Üssün sağlığı, workspace'in bir niteliği olarak tutulur: her istemci bunu okuyabilir
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Her oyuncuya leaderboard üzerinde Money verilir
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)

-- Bir düşman üsse ulaştı
local function damageBase(amount)
	local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
	workspace:SetAttribute("BaseHealth", health)
	print("Base: " .. health)
end

-- Bir düşmanı yol boyunca yürüt. MoveTo, 8 saniye sonra denemeyi bırakır ve bunu bildirir
-- (MoveToFinished ile false); bu yüzden yavaş bir düşman, varana kadar tekrar gönderilir.
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
	-- Üsse ulaştı
	damageBase(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- Kapıda beliren ve yolu izleyen yeni bir düşman
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- İlk yol noktasının hemen yukarısına bırakılır
	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

-- Bir dalga: düşmanları teker teker gönder, ardından hepsi gidene kadar bekle
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

-- Dalgalar, her biri bir aradan sonra gelir
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end

Roblox Oyunu: Kule Savunması bölümündeki tüm dersler

Kendi başına pratik yap: Roblox playground