الموجات
الدرس 4 من 18 في دورة لعبة Roblox: الدفاع عن الأبراج على Coddy.
زومبي واحد لا يصنع لعبة. تعرض Settings.Waves الموجات، وكل موجة قائمة بأسماء الأعداء:
Waves = {
{ "Zombie", "Zombie", "Zombie" },
{ "Zombie", "Runner" },
}تُنشئ runWave(list) أعداءها واحدًا تلو الآخر، بفاصل Settings.SpawnGap ثانية، ثم تنتظر حتى يصبح workspace.Enemies فارغًا، لذا لا تبدأ الموجة التالية إلا بعد انتهاء هذه الموجة. قبل كل موجة، يحصل اللاعبون على Settings.WaveBreak ثانية للاستعداد.
تمر الحلقة الرئيسية على الموجات بالترتيب: for i, list in Settings.Waves do.
التحدي
سهل- اكتب
runWave(list): أنشئ كل عدو في القائمة، وانتظرSettings.SpawnGapبعد كل واحد، ثم انتظر حتى لا يكون لدىenemiesأي عناصر فرعية. - استبدل الإنشاء الفردي بحلقة تمر على
Settings.Waves: انتظرSettings.WaveBreak، ثم شغّل الموجة.
يحتوي عالم هذا الدرس على موجتين قصيرتين. اضغط على Play، ثم Check.
جرّب بنفسك
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")
-- نقاط المسار بالترتيب (أسماؤها 1، 2، 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
return tonumber(a.Name) < tonumber(b.Name)
end)
-- صحة القاعدة، بوصفها سمةً في workspace: يمكن لكل عميل قراءتها
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)
-- يحصل كل لاعب على Money في لوحة المتصدرين
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)
-- وصل عدو إلى القاعدة
local function damageBase(amount)
local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
workspace:SetAttribute("BaseHealth", health)
end
-- حرّك عدوًا على طول المسار. يتوقف MoveTo عن المحاولة بعد 8 ثوانٍ ويشير إلى ذلك
-- (MoveToFinished مع false)، لذا يُوجَّه العدو البطيء مجددًا حتى يصل.
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
-- وصل إلى القاعدة
damageBase(1)
enemy:Destroy()
end
-- عدو جديد عند البوابة، يسير على طول المسار
local function spawnEnemy(kind)
local enemy = ServerStorage.Enemies[kind]:Clone()
-- يوضع مباشرةً فوق أول نقطة مسار
enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
enemy.Parent = enemies
task.spawn(walkPath, enemy)
return enemy
end
-- عدو واحد في الوقت الحالي
spawnEnemy("Zombie")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.