Menu
CoddyTech

المتجر

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

الآن جانب اللاعب. يُعدّ DefenseClient LocalScript داخل HUD، وهي ScreenGui ينسخها Roblox إلى شاشة كل لاعب، لذا فإن script.Parent هو HUD. يحتوي الإطار Shop على TextButton لكل برج، وتُسمّى الأزرار بأسماء الأبراج.

قد يبدأ LocalScript قبل وصول كائنات اللعبة إلى جهاز اللاعب، لذا يعثر عليها باستخدام WaitForChild. يُطلق حدث Activated للزر عند النقر عليه أو لمسه:

local Settings = require(game.ReplicatedStorage:WaitForChild("Settings"))
local button = script.Parent.Shop.Frost
button.Text = "Frost tower"
button.Activated:Connect(function()
	print("Frost picked")
end)
challenge icon

التحدي

متوسط

أضف الأسعار إلى أزرار المتجر في DefenseClient.

  1. أضف local Settings = require(game.ReplicatedStorage:WaitForChild("Settings")) وlocal hud = script.Parent.
  2. لكل TextButton في hud.Shop، عيّن نصه إلى button.Name .. " $" .. Settings.Towers[button.Name].Price.
  3. عند تنشيطه باستخدام Activated، خزّن اسمه في local selected.

اضغط «العب»: سيعرض المتجر Archer $60 وCannon $120 وFrost $90. ثم اضغط «تحقق».

جرّب بنفسك

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)
	print("Base: " .. 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 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

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

تدرّب بنفسك: Playground لـ Roblox