Menu
CoddyTech

Bir Kule İnşa Et

Coddy'nin Roblox Oyunu: Kule Savunması kursunda ders 6 / 18.

Şimdi oyuncunun tarafına geçelim. DefenseClient, HUD'un içinde bulunan bir LocalScript'tir. HUD, Roblox'un her oyuncunun ekranına kopyaladığı bir ScreenGui'dir. HUD'un Shop çerçevesinde, her kule için kuleye adını veren bir TextButton bulunur. Bir düğmenin Activated olayı, düğmeye tıklandığında veya dokunulduğunda tetiklenir:

button.Activated:Connect(function()
	selected = button.Name
end)

Ardından gri pedlerden birine tıklamak, seçilen kuleyi oraya inşa eder. İstemci, tıklamayı fareden (me:GetMouse(), Button1Down olayı ve işaretçinin altındaki parça olan Target) okur; ancak kendi başına hiçbir şey inşa edemez: kuleler sunucuda bulunur. RemoteEvent Remotes.Place aracılığıyla sunucuya istekte bulunur:

-- istemci
remotes.Place:FireServer(pad, "Archer")
-- sunucu: Roblox önce player'ı ekler
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
end)

Kule modelleri ServerStorage.Towers içinde bekler; sunucu bunlardan birini klonlayıp pedin üzerine yerleştirir.

challenge icon

Görev

Orta

DefenseClient içinde:

  1. Players, Settings (WaitForChild ile), local remotes = game.ReplicatedStorage:WaitForChild("Remotes"), local me = Players.LocalPlayer ve local hud = script.Parent öğelerini al.
  2. hud.Shop içindeki her TextButton için, metnini kulenin adına ve fiyatına (Archer $60) ayarla ve Activated olayında onu selected değişkenine kaydet.
  3. Farenin Button1Down olayında, hedef workspace.Pads içindeyse ve bir kule seçiliyse, pad'i ve kulenin adını remotes.Place ile gönder.

DefenseServer içinde: local remotes ve local towers = workspace.Towers satırlarını ekle, placeTower(pad, kind) fonksiyonunu yaz (kuleyi klonla, PivotTo ile pad'in CFrame'ini pad'in yüksekliğinin yarısı artı 1 kadar yukarı taşı, towers nesnesinin alt öğesi yap) ve remotes.Place.OnServerEvent olayını bu fonksiyona bağla.

Play'e bas, bir kule seç ve bir pad'e tıkla. Ardından Check'e 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ılmışlar)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
	return tonumber(a.Name) < tonumber(b.Name)
end)

-- workspace'in bir özniteliği olarak üssün canı: her istemci bunu okuyabilir
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)

-- Her oyuncu, liderlik tablosunda Money alır
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)
end

-- Bir düşmanı yol boyunca ilerlet. MoveTo, 8 saniye sonra denemeyi bırakır ve bunu bildirir
-- (MoveToFinished, false ile döner); bu yüzden yavaş bir düşman varana kadar yeniden yönlendirilir.
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, yol boyunca ilerleyen yeni bir düşman
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- ilk yol noktasının hemen üzerine yerleştirilir
	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 gelir, ardından hepsi gidene kadar beklenir
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
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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