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.
Görev
OrtaDefenseClient içinde:
Players,Settings(WaitForChildile),local remotes = game.ReplicatedStorage:WaitForChild("Remotes"),local me = Players.LocalPlayervelocal hud = script.Parentöğelerini al.hud.Shopiçindeki her TextButton için, metnini kulenin adına ve fiyatına (Archer $60) ayarla veActivatedolayında onuselecteddeğişkenine kaydet.- Farenin
Button1Downolayında, hedefworkspace.Padsiçindeyse ve bir kule seçiliyse, pad'i ve kulenin adınıremotes.Placeile 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
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.