Nişan Al
Coddy'nin Roblox Oyunu: Kule Savunması kursunda ders 7 / 18.
Bir kule, Range içindeki alanı korur. Her kule kendi iş parçacığında kendi döngüsünü çalıştırır: menzil içindeki en yakın canlı düşmanı bulur ve Head parçasını ona bakacak şekilde döndürür.
En yakını bulmak klasik bir döngüdür: hiçbir şeyle ve en iyi mesafe olarak menzille başla, ardından şimdiye kadarki en iyi mesafeden daha yakın olan her düşmanı tut.
local best, bestDistance = nil, range
for _, enemy in enemies:GetChildren() do
-- Şu ana kadarki en iyisinden daha mı yakın? Onu tut
end
return bestCFrame.lookAt(from, at), from konumunda duran ve at konumuna bakan bir CFrame'dir; böylece başı hareket ettirmeden döndürür:
tower.Head.CFrame = CFrame.lookAt(tower.Head.Position, target.HumanoidRootPart.Position)Sonsuza kadar çalışan bir döngü her turda beklemelidir, yoksa oyunu dondurur: hedef bulup bulmadığına bakılmaksızın 0.1 saniye bekle.
Görev
OrtanearestEnemy(position, range)işlevini yaz: yaşayan (birHumanoidRootPartbileşeni veHealth > 0değeri olan) vepositionkonumuna en yakın,rangesınırları içindeki düşmanı veya nil değerini döndürsün.runTower(tower)işlevini yaz: kule oyundayken, kafasınınSettings.Towers[tower.Name].Rangemenzili içindeki en yakın düşmanı bul, kafayı ona çevirecek şekilde döndür vetask.wait(0.1)çağır.placeTowerişlevinin sonundatask.spawn(runTower, tower)ile başlat.
Play'e bas, başlangıcın yanına bir Archer inşa et ve hedefi takip edişini izle. Ardından Check'e bas.
Kendin dene
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local remotes = game.ReplicatedStorage.Remotes
local enemies = workspace.Enemies
local towers = workspace.Towers
print("The base can take " .. Settings.BaseHealth .. " hits")
-- Yol noktaları, sırasıyla (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)
-- Üssün sağlığı, workspace'in bir niteliği olarak: 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 vazgeçer ve bunu bildirir
-- (MoveToFinished, false ile), bu yüzden yavaş bir düşman varana kadar yeniden 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, yol boyunca ilerleyen yeni bir düşman
local function spawnEnemy(kind)
local enemy = ServerStorage.Enemies[kind]:Clone()
-- ilk yol noktasının hemen üstüne yerleştirildi
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 platforma kule inşa et
local function placeTower(pad, kind)
local tower = ServerStorage.Towers[kind]:Clone()
tower:PivotTo(pad.CFrame + Vector3.new(0, pad.Size.Y / 2 + 1, 0))
tower.Parent = towers
end
-- İstemci, bir platforma kule yerleştirilmesini ister
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
placeTower(pad, kind)
end)
-- Bir dalga: düşmanları teker teker gelir, ardından hepsi yok olana 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
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.