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

أطلق

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

مواجهة العدو نصف المهمة. تُلحق shoot الضرر بالهدف باستخدام Humanoid:TakeDamage، وتُحدث ومضة ضوء قصيرة من الرأس إلى الهدف: جزء نيون رفيع يزيله Debris بعد عُشر ثانية.

Debris:AddItem(ray, 0.1) -- يُدمَّر بعد 0.1 ثانية

بعد إطلاق النار، ينتظر البرج مدة Cooldown قبل أن يتمكن من إطلاق النار مجددًا؛ وهذا ما يجعل Archer سريعًا وCannon بطيئًا.

عندما تصل صحة Humanoid إلى 0، يُطلَق الحدث Died. ينبغي أن يغادر العدو المهزوم اللعبة فورًا، لذا يربط spawnEnemy الحدث Died بتدميره: عندئذٍ يرى walkPath أنه اختفى ويتوقف.

challenge icon

التحدي

متوسط
  1. احصل على خدمة Debris. اكتب beam(from, to): جزءًا نيونًا مثبتًا، أبعاده 0.2 في 0.2 وطوله يساوي المسافة، واضبطه باستخدام CFrame.lookAt((from + to) / 2, to)، ثم أزله بواسطة Debris بعد 0.1 ثانية.
  2. اكتب shoot(tower, target, info): استدعِ TakeDamage(info.Damage) على Humanoid الخاص بالهدف، ثم أطلق شعاعًا من الرأس إلى الهدف.
  3. في runTower، أطلق النار بعد الالتفاف، ثم انتظر info.Cooldown بدلًا من 0.1 (أبقِ على 0.1 عند عدم وجود هدف).
  4. في spawnEnemy، دمّر العدو عندما يموت Humanoid الخاص به.

اضغط على Play، ثم 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

-- أقرب عدو حي ضمن نطاق نقطة معيّنة، أو 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

-- مهمة البرج: استهداف أقرب عدو ضمن النطاق
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

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

-- يطلب العميل وضع برج على منصة
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: الدفاع عن الأبراج