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

صوّب

الدرس 7 من 18 في دورة لعبة Roblox: الدفاع عن الأبراج على Coddy.

يحرس البرج المنطقة الواقعة ضمن Range الخاص به. يعمل كل برج بحلقته الخاصة ضمن خيطه الخاص: اعثر على أقرب عدو حي ضمن المدى، وأدر Head ليواجهه.

العثور على الأقرب نمط كلاسيكي للحلقات: ابدأ بلا شيء واجعل المدى أفضل مسافة، واحتفظ بأي عدو أقرب من الأفضل حتى الآن.

local best, bestDistance = nil, range
for _, enemy in enemies:GetChildren() do
	-- هل هو أقرب من أفضل خيار حتى الآن؟ احتفظ به
end
return best

يمثل CFrame.lookAt(from, at) إطار CFrame واقفًا عند from وينظر إلى at، لذا فهذا يدير الرأس دون تحريكه:

tower.Head.CFrame = CFrame.lookAt(tower.Head.Position, target.HumanoidRootPart.Position)

يجب أن تنتظر الحلقة التي تعمل إلى الأبد في كل دورة، وإلا ستجمّد اللعبة: انتظر 0.1 ثانية سواء عثرت على هدف أم لا.

challenge icon

التحدي

متوسط
  1. اكتب nearestEnemy(position, range): أقرب عدو حيّ (لديه HumanoidRootPart وHealth > 0) إلى position، ضمن range، أو nil.
  2. اكتب runTower(tower): ما دام البرج في اللعبة، اعثر على أقرب عدو إلى رأسه ضمن Settings.Towers[tower.Name].Range، وأدِر الرأس ليواجهه، ثم نفّذ task.wait(0.1).
  3. ابدأ تشغيلها في نهاية placeTower باستخدام task.spawn(runTower, tower).

اضغط Play، وابنِ برج Archer عند البداية، وشاهده وهو يتعقّب الأعداء. ثم اضغط Check.

جرّب بنفسك

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")

-- نقاط المسار بالترتيب (أسماؤها 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(Settings.Enemies[enemy.Name].Damage)
	enemy:Destroy()
end

-- عدو جديد عند البوابة يسير على طول المسار
local function spawnEnemy(kind)
	local enemy = ServerStorage.Enemies[kind]:Clone()
	-- يُوضَع فوق أول نقطة في المسار مباشرةً
	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

-- ابنِ برجًا على منصة
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

-- يطلب العميل بناء برج على منصة
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
	placeTower(pad, kind)
end)

-- موجة واحدة: يظهر أعداؤها واحدًا تلو الآخر، ثم ننتظر حتى يختفوا جميعًا
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

-- الموجات، تأتي كل واحدة منها بعد استراحة
for i, list in Settings.Waves do
	task.wait(Settings.WaveBreak)
	runWave(list)
end
quiz iconاختبر نفسك

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

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