Menu
CoddyTech
flag Ar iconالعربيةdown icon

الموجات

الدرس 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.

challenge icon

التحدي

سهل
  1. اكتب runWave(list): أنشئ كل عدو في القائمة، وانتظر Settings.SpawnGap بعد كل واحد، ثم انتظر حتى لا يكون لدى enemies أي عناصر فرعية.
  2. استبدل الإنشاء الفردي بحلقة تمر على 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")
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Roblox: الدفاع عن الأبراج