Ateş Et
Coddy'nin Roblox Oyunu: Kule Savunması kursunda ders 8 / 18.
Düşmanla yüzleşmek işin yarısıdır. shoot, hedefe Humanoid:TakeDamage ile hasar verir ve kafadan hedefe doğru kısa bir ışık parlaması oluşturur: Debris'in saniyenin onda biri kadar sonra kaldırdığı ince, neon renkli bir parça.
Debris:AddItem(ray, 0.1) -- 0.1 saniye içinde yok edilirBir atıştan sonra kule, tekrar ateş edebilmek için Cooldown süresi boyunca bekler; Okçuyu hızlı, Topu ise yavaş yapan şey budur.
Bir Humanoid'in sağlığı 0'a ulaştığında Died olayı tetiklenir. Yenilmiş bir düşman oyundan hemen ayrılmalıdır; bu nedenle spawnEnemy, onu yok etmek için Died olayına bağlanır: böylece walkPath düşmanın artık orada olmadığını görür ve durur.
Görev
OrtaDebrishizmetini al.beam(from, to)yaz: sabitlenmiş neon bir parça oluştur; boyutları 0.2'ye 0.2, uzunluğu mesafe kadar olsun veCFrame.lookAt((from + to) / 2, to)ile ayarlansın; 0.1 saniye sonra Debris tarafından kaldırılsın.shoot(tower, target, info)yaz: hedefin Humanoid'ineTakeDamage(info.Damage)uygula, ardından baştan hedefe bir ışın gönder.runToweriçinde, döndükten sonra ateş et ve ardından 0.1 yerineinfo.Cooldownkadar bekle (hedef yoksa 0.1 değerini koru).spawnEnemyiçinde, Humanoid'i öldüğünde düşmanı yok et.
Play'e, 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")
-- Sırayla yol noktaları (adları 1, 2, 3... şeklindedir)
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 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 sonuçlanır); bu yüzden yavaş bir düşmana, varana kadar yeniden hareket komutu verilir.
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 yol boyunca ilerleyen yeni bir düşman
local function spawnEnemy(kind)
local enemy = ServerStorage.Enemies[kind]:Clone()
-- İlk yol noktasının hemen üstüne 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 noktanın menzili içindeki en yakın hayattaki düşman veya nil
local function nearestEnemy(position, range)
local best, bestDistance = nil, range
for _, enemy in enemies:GetChildren() do
local root = enemy:FindFirstChild("HumanoidRootPart")
if root and enemy.Humanoid.Health > 0 then
local distance = (root.Position - position).Magnitude
if distance <= bestDistance then
best, bestDistance = enemy, distance
end
end
end
return best
end
-- Bir kulenin görevi: menzilindeki en yakın düşmana nişan almak
local function runTower(tower)
local info = Settings.Towers[tower.Name]
while tower.Parent do
local target = nearestEnemy(tower.Head.Position, info.Range)
if target then
tower.Head.CFrame = CFrame.lookAt(tower.Head.Position, target.HumanoidRootPart.Position)
task.wait(0.1)
else
task.wait(0.1)
end
end
end
-- Bir platformun üzerine 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
task.spawn(runTower, tower)
end
-- İstemci, bir platforma kule yerleştirilmesini ister
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
placeTower(pad, kind)
end)
-- Bir dalga: düşmanlarını teker teker ortaya çıkar, ardından hepsi yok olana 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
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.