→ كل الدروس
الدرس 5

اصنع أول لعبة سرقة ودفاع لك

يأخذ كل لاعب قاعدة. امسك الجوهرة من الوسط، واركض بها إلى بيتك لتسجل نقطة، وامسك بأي لاعب يحملها.

مجاني70 دقيقة · مبتدئ، الدرس الأخير · Roblox Studio
1
الخطوة 1 / 8

جهّز المكان

  1. افتح Roblox Studio، واضغط New Experience واختر قالب Baseplate.
  2. ستكون الجوهرة في وسط الخريطة. وتقف حولها أربع قواعد، كل واحدة على بعد نحو 60 studs من الوسط.
  3. تحتاج هذه اللعبة إلى لاعبَين على الأقل، لذلك ستختبرها في النهاية مع لاعبَين تجريبيَّين.

المزيد من التفاصيل

  • قالب Baseplate موجود في قائمة القوالب على شاشة البداية.
  • يعرض الحقل Position في Properties مكان القطعة. الموضع Position 60, 0.5, 0 يبعد 60 studs عن وسط الخريطة.
  • انقل SpawnLocation، المنصة التي يظهر عليها اللاعبون، قرب الوسط، ليبدأ كل لاعب على المسافة نفسها من الجوهرة.
  • على جهاز Mac استخدم المفتاح Cmd كلما قال هذا الدرس Ctrl.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

2
الخطوة 2 / 8

ابنِ القواعد

  1. في Explorer مرّر الفأرة فوق Workspace، واضغط + وأضف Folder. سمّه Bases.
  2. أضف Part. اجعل Size يساوي 16, 1, 16، وفعّل Anchored واجعله رماديًا. اسحبه إلى Bases وسمّه Base1.
  3. كرره ثلاث مرات بـ Ctrl+D. سمّ النسخ Base2 و Base3 و Base4 وضع واحدة في كل جهة من الخريطة.

المزيد من التفاصيل

  • لتضع القطعة في المجلد، اسحب اسمها في Explorer إلى الاسم Bases.
  • النسخ المصنوعة بـ Ctrl+D تكون داخل المجلد Bases أصلًا. غيّر اسم كل واحدة بالمفتاح F2.
  • يجب أن تكون الأسماء Base1 وBase2 وBase3 وBase4 تمامًا، بلا مسافة قبل الرقم.
  • في الخادم الذي فيه أكثر من أربعة لاعبين يكون اللاعبون أكثر من القواعد. تستطيع لاحقًا ضبط حجم الخادم على 4 في إعدادات اللعبة في Creator Hub.
نصيحة. اجعل القواعد الأربع على المسافة نفسها من الوسط. عندها تكون اللعبة عادلة للجميع.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

3
الخطوة 3 / 8

اصنع الجوهرة

  1. أضف Part في وسط الخريطة، على ارتفاع نحو 4 studs فوق الأرض. اجعل Size يساوي 2, 2, 2، واختر لونًا فاتحًا واجعل Material يساوي Neon. سمّه Gem.
  2. فعّل Anchored و Massless، وأطفئ CanCollide.
  3. مرّر الفأرة فوق Gem، واضغط + وأضف ProximityPrompt. اجعل ActionText يساوي Take و HoldDuration يساوي 1.

ماذا يفعل كل جزء

  • يُظهر ProximityPrompt زرًا عندما يقف لاعب قريبًا. وإذا ضغطت عليه ثانية واحدة يعمل.
  • تشغيل Massless وإطفاء CanCollide يمنعان الجوهرة من إبطاء اللاعب الذي يحملها أو دفعه.

المزيد من التفاصيل

  • Anchored وMassless وCanCollide مربعات اختيار في Properties.
  • عندما تضغط +، اكتب ProximityPrompt لتجده. اضغط عليه ثم غيّر ActionText وHoldDuration في Properties.
  • في اللعبة يظهر زر صغير عليه الحرف E والكلمة Take عندما تقف قرب الجوهرة.
  • على الهاتف يبقي اللاعبون إصبعهم مضغوطًا على هذا الزر.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

4
الخطوة 4 / 8

أعطِ كل لاعب قاعدة ونقاطًا

  1. مرّر الفأرة فوق ServerScriptService، واضغط + وأضف Script. سمّه Game.
  2. احذف السطر الموجود فيه والصق هذا الكود. هذا أول ثلاثة أجزاء.
  3. اضغط Play. تتحول قاعدة واحدة إلى الأخضر. هذه قاعدتك.
ServerScriptService > Game (1 / 3)
local Players = game:GetService("Players")

local bases = workspace:WaitForChild("Bases")
local gem = workspace:WaitForChild("Gem")
local home = gem.CFrame
local carrier = nil

Players.PlayerAdded:Connect(function(player)
	local stats = Instance.new("Folder")
	stats.Name = "leaderstats"
	stats.Parent = player

	local score = Instance.new("IntValue")
	score.Name = "Score"
	score.Parent = stats

	for _, base in ipairs(bases:GetChildren()) do
		if base:GetAttribute("Owner") == nil then
			base:SetAttribute("Owner", player.UserId)
			base.Color = Color3.fromRGB(60, 220, 120)
			break
		end
	end
end)

Players.PlayerRemoving:Connect(function(player)
	for _, base in ipairs(bases:GetChildren()) do
		if base:GetAttribute("Owner") == player.UserId then
			base:SetAttribute("Owner", nil)
			base.Color = Color3.fromRGB(160, 160, 160)
		end
	end
end)

ماذا يفعل كل جزء

  • تجد الأسطر الأولى القواعد والجوهرة وتتذكر المكان الذي بدأت منه الجوهرة.
  • SetAttribute تكتب UserId المالك على أول قاعدة حرة.
  • PlayerRemoving تحرر القاعدة مرة أخرى عندما يغادر مالكها.

المزيد من التفاصيل

  • يُفتح السكربت في تبويب جديد. اضغط داخل الكود، ثم Ctrl+A ثم Ctrl+V لتستبدل كل شيء.
  • أي قاعدة تتحول إلى الأخضر يعتمد على ترتيب القواعد في المجلد. تجوّل لتجد قاعدتك.
  • تعرض قائمة اللاعبين في الزاوية العلوية اليمنى Score 0.
  • لا يحدث شيء بعد عندما تمشي إلى الجوهرة وتضغط E مع الاستمرار. هذا يأتي في الخطوة التالية.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

5
الخطوة 5 / 8

دع اللاعبين يأخذون الجوهرة

  1. افتح سكربت Game مرة أخرى.
  2. الصق هذا الكود تحت كود الخطوة السابقة.
  3. اضغط Play، واذهب إلى الجوهرة واضغط E مع الاستمرار. تقفز الجوهرة فوق رأسك وتتبعك.
ServerScriptService > Game (2 / 3)
local function resetGem()
	carrier = nil

	local weld = gem:FindFirstChild("CarryWeld")
	if weld then
		weld:Destroy()
	end

	gem.Anchored = true
	gem.CFrame = home
	gem.ProximityPrompt.Enabled = true
end

gem.ProximityPrompt.Triggered:Connect(function(player)
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if carrier or not root then return end

	carrier = player
	gem.ProximityPrompt.Enabled = false
	gem.Anchored = false
	gem.CFrame = root.CFrame * CFrame.new(0, 4, 0)

	local weld = Instance.new("WeldConstraint")
	weld.Name = "CarryWeld"
	weld.Part0 = root
	weld.Part1 = gem
	weld.Parent = gem
end)

ماذا يفعل كل جزء

  • carrier يتذكر من يحمل الجوهرة. لا يستطيع أحد غيره أخذها وهي محمولة.
  • يلصق WeldConstraint الجوهرة باللاعب، فتتحرك معه.
  • resetGem تزيل اللحام وتعيد الجوهرة إلى الوسط.

المزيد من التفاصيل

  • لفتح السكربت مرة أخرى، اضغط ضغطًا مزدوجًا على Game في Explorer.
  • اضغط بعد آخر حرف في الكود تمامًا ثم اضغط Enter مرتين. بعدها اضغط Ctrl+V. لا تضغط Ctrl+A هذه المرة، وإلا استبدلت الجزء الأول.
  • تطفو الجوهرة على ارتفاع 4 studs فوق رأسك أثناء حملها.
  • للتجربة: خذ الجوهرة، ثم تأكد أن الزر Take اختفى ما دمت تحملها.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

6
الخطوة 6 / 8

أضف النقاط والإمساك

  1. الصق هذا الجزء الأخير في آخر سكربت Game تمامًا.
  2. اضغط Play، وخذ الجوهرة واركض إلى قاعدتك الخضراء. تزيد Score بمقدار 1 وتعود الجوهرة إلى الوسط.
ServerScriptService > Game (3 / 3)
for _, base in ipairs(bases:GetChildren()) do
	base.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player and player == carrier and base:GetAttribute("Owner") == player.UserId then
			player.leaderstats.Score.Value += 1
			resetGem()
		end
	end)
end

while true do
	task.wait(0.2)

	if carrier then
		local weld = gem:FindFirstChild("CarryWeld")
		local root = weld and weld.Part0
		local character = root and root.Parent
		local humanoid = character and character:FindFirstChildOfClass("Humanoid")

		if not humanoid or humanoid.Health <= 0 or root.Position.Y < -20 then
			resetGem()
		else
			for _, other in ipairs(Players:GetPlayers()) do
				local otherRoot = other ~= carrier and other.Character and other.Character:FindFirstChild("HumanoidRootPart")
				if otherRoot and (otherRoot.Position - root.Position).Magnitude < 5 then
					resetGem()
					break
				end
			end
		end
	end
end

ماذا يفعل كل جزء

  • تتحقق كل قاعدة من ثلاثة أشياء: لاعب لمسها، وهذا اللاعب يحمل الجوهرة، والقاعدة له.
  • تعمل الحلقة في الأسفل 5 مرات في الثانية. إذا اقترب لاعب آخر من الحامل أكثر من 5 studs، تعود الجوهرة.
  • تعيد الحلقة الجوهرة أيضًا إذا غادر الحامل اللعبة أو سقط خارج الخريطة.

المزيد من التفاصيل

  • اضغط مرة أخرى بعد آخر حرف في السكربت تمامًا، واضغط Enter مرتين ثم الصق.
  • للسكربت النهائي ثلاثة أجزاء بهذا الترتيب: القواعد والنقاط، وأخذ الجوهرة، وتسجيل النقاط ولمس اللاعبين الآخرين.
  • القاعدة الرمادية التي لا تخص أحدًا لا تعطي نقاطًا. فقط قاعدتك الخضراء تُحسب.
  • لا تستطيع تجربة اللمس وحدك. ستفعل ذلك مع لاعبَين في الخطوة التالية.
خطأ شائع. أن تلصق هذا الجزء في وسط السكربت. حلقة while لا تنتهي أبدًا، فلا يعمل أي كود تحتها.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

7
الخطوة 7 / 8

اختبر مع لاعبَين

  1. بجانب زر Play افتح القائمة الصغيرة واختر Server & Clients. اجعل عدد اللاعبين 2 واضغط Play.
  2. يفتح Studio نافذتَي لعبة. كل نافذة لاعب مختلف وله قاعدة مختلفة.
  3. خذ الجوهرة في إحدى النافذتين. وفي النافذة الأخرى اركض إلى ذلك اللاعب. تعود الجوهرة إلى الوسط.
  4. أوقف الاختبار بزر Stop الأحمر في نافذة Studio الرئيسية، ثم أعد القائمة إلى Test.

المزيد من التفاصيل

  • القائمة الصغيرة هي السهم الذي بجانب زر Play مباشرة في أعلى Studio.
  • تُفتح نافذتا اللعبة فوق بعضهما. اسحب إحداهما جانبًا لترى الاثنتين.
  • اضغط داخل نافذة قبل أن تستخدم لوحة المفاتيح. تذهب المفاتيح إلى النافذة التي ضغطت عليها آخر مرة.
  • التجربة بنافذتين تحتاج إلى حاسوب ذاكرته كافية. إذا كان بطيئًا جدًا، فأغلق البرامج الأخرى أولًا.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

8
الخطوة 8 / 8

انشرها

  1. اختر File → Publish to Roblox. أعطِ اللعبة اسمًا ووصفًا قصيرًا.
  2. في موقع Creator Hub افتح لعبتك واملأ استبيان Maturity.
  3. اجعل اللعبة Public وأرسل الرابط إلى صديق.

المزيد من التفاصيل

  • في أول مرة تنشر فيها، يطلب Studio اسمًا ووصفًا. اضغط Create.
  • Creator Hub هو الموقع create.roblox.com. سجّل الدخول بالحساب نفسه واضغط على لعبتك في القائمة.
  • قد تطلب Roblox المزيد قبل أن تصبح اللعبة عامة، مثل التحقق من العمر على الحساب. تخبرك الصفحة بما ينقص.
  • إذا كان عمرك أقل من 18 سنة، فافعل هذه الخطوة مع أحد والديك.
نصيحة. هذه اللعبة لا تكون ممتعة إلا مع لاعبين آخرين. ادعُ صديقين أو ثلاثة إلى السيرفر نفسه في المباراة الأولى.
هذه الخطوة لا تعمل معي

تحقق من هذه الأمور الثلاثة أولًا

  • اسم كل قطعة وكل سكربت مطابق تمامًا لما في الدرس، بنفس الأحرف الكبيرة.
  • السكربت موجود داخل الشيء الصحيح. انظر إلى العنوان فوق صندوق الكود.
  • افتح نافذة Output من قائمة Window. النص الأحمر يعرض السكربت والسطر الذي فيه المشكلة.

ما زلت عالقًا؟ راسلنا ←

الآن غيّره بنفسك

  • أنهِ الجولة عندما يصل لاعب إلى 5 نقاط وأعد كل النقاط إلى 0.
  • أضف جوهرة ثانية بلون مختلف.
  • اجعل الحامل أبطأ. تلميح: اجعل Humanoid.WalkSpeed يساوي 12 عند أخذ الجوهرة وأعده إلى 16 في resetGem.