دروس تعليمية متوسطة

نقاط درجات

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

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

إعداد

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

يمكنك أيضًا استخدام الحمم القاتلة لقتل المستخدمين عندما يسقطون عن المنصات، أو فقط تركهم يسقطون إلى هلاكهم. تأكد من وضع SpawnLocation في مكان يمكن للمستخدمين القفز إليه على المنصات للبدء في اللعب.

نقطة انطلاق فوق شبكة من المنصات المتلاشية، فوق أرضية من الحمم

نقاط اللاعب

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

لوحة قياس مع اسم المستخدم والنقاط المعروضة

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

من الأفضل وضع السكريبتات التي تقوم بإعداد حالة التجربة في ServerScriptService لأنها ستعمل تلقائيًا عند بدء التجربة. في ServerScriptService، أنشئ سكريبتًا يسمى SetupPoints.

سكريبت SetupPoints في مكانه في ServerScriptService في نافذة المستكشف

استمع للاعبين

في Roblox، الخدمة هي كائن يؤدي مجموعة من المهام المفيدة. تحتوي خدمة Players على حدث يسمى PlayerAdded يمكنك استخدامه لإعداد النقاط لكل مستخدم ينضم إلى التجربة.

يمكنك الوصول إلى الخدمات باستخدام وظيفة GetService في كائن game. game هو متغير يمكن الوصول إليه من أي مكان ويحتوي على كل شيء في تجربتك.

  1. أنشئ متغيرًا لخدمة اللاعبين باستخدام game:GetService("Players").

  2. أنشئ دالة تسمى onPlayerAdded مع معلمة للاعب القادم.

  3. قم بتوصيل دالة onPlayerAdded بحدث PlayerAdded.


    local Players = game:GetService("Players")
    local function onPlayerAdded(player)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

إنشاء مجلد الإحصائيات

لجعل نقاط المستخدم تعرض في لوحة القياس، كل ما تحتاجه هو إنشاء Folder جديدة في كائن Player الخاص بهم يسمى "leaderstats" ووضع نقاطهم هناك. يمكن إنشاء كائنات جديدة من داخل السكريبت عبر وظيفة Instance.new().

  1. أنشئ كائن Folder جديد باستخدام Instance.new("Folder")، وقم بتخزين النتيجة في متغير جديد يسمى leaderstats.


    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    end
  2. قم بتعيين خاصية الاسم لـ leaderstats إلى "leaderstats".

  3. اجعل leaderstats من تابعية لـ player.


    local Players = game:GetService("Players")
    local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    end
    Players.PlayerAdded:Connect(onPlayerAdded)

إنشاء النقاط

يقرأ نظام لوحة القياس أي قيم في مجلد leaderstats ويعرض ما يجده.

لإضافة إحصائية ستتبع نقاط اللاعب، يمكن رعاية كائن جديد من نوع IntValue في مجلد leaderstats. سيتم عرض اسم كائن القيمة جنبًا إلى جنب مع قيمته الحالية.

  1. استخدم متغيرًا باسم points لإنشاء كائن IntValue جديد باستخدام Instance.new().
  2. قم بتعيين Name إلى "Points".
  3. قم بتعيين Value إلى 0؛ هذا هو ما ستعرضه لوحة القياس بشكل أولي للاعب.
  4. اجعل كائن points من تابعية لـ leaderstats.

local Players = game:GetService("Players")
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
end
Players.PlayerAdded:Connect(onPlayerAdded)

اختبر تجربتك وينبغي أن ترى لوحة القياس تظهر في الزاوية العلوية اليمنى مع أسماء مستخدميك ودرجة النقاط بجانبهم.

احتساب الوقت

يجب على كل مستخدم كسب نقطة مقابل كل ثانية يبقون على قيد الحياة. يمكن استخدام while loop ووظيفة task.wait() لتحديث قيمة النقاط كل ثانية.

  1. في نهاية السكريبت، أنشئ while loop مع true كشرط.
  2. في الحلقة، task.wait() لمدة 1 ثانية.

Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
end

قائمة اللاعبين

لتنفيذ كود لكل مستخدم في التجربة، تحتاج إلى التنقل خلال مصفوفة المستخدمين المعادة من وظيفة GetPlayers.

المصفوفة هي قائمة بالعناصر المخزنة بترتيب. يمكن الوصول إلى كل عنصر من خلال موقع الفهرس الخاص به، بدءًا من 1. يمكنك الحصول على طول المصفوفة من خلال وضع علامة # قبلها.

  1. قم بتخزين نتيجة Players:GetPlayers() في متغير playerList.
  2. أنشئ حلقة for بقيمة بدء تبلغ 1 وقيمة انتهاء تبلغ #playerList، بحيث تحصل على تكرار واحد للحلقة لكل لاعب.

while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
-- أضف منطقك هنا لكل لاعب في playerList
end
end

منح النقاط

لمنح نقطة لكل مستخدم في حلقة for، ستحتاج إلى سحب المستخدم من المصفوفة وإضافة 1 إلى كائن Points المخزن في مجلد leaderstats الخاص بهم.

يمكن الوصول إلى الكائنات المخزنة في المصفوفة باستخدام أقواس مربعة - على سبيل المثال، يمكن الوصول إلى العنصر الأول في المصفوفة playerList باستخدام playerList[1]. إذا كتبت playerList[currentPlayer] في حلقة for، يمكنك المرور عبر كل مستخدم في القائمة مع كل تكرار للحلقة.

  1. قم بتخزين المستخدم في playerList[currentPlayer] في متغير يسمى player.
  2. قم بتخزين كائن Points الخاص بالمستخدم في متغير يسمى points.
  3. قم بتعيين خاصية Value لـ points إلى points.Value + 1.

while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
local points = player.leaderstats.Points
points.Value += 1
end
end

اختبر تجربتك وينبغي أن تجد أن لوحة القياس تظهر درجة اللاعب تتزايد بمقدار 1 كل ثانية.

استمع للشخصيات

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

ستحتاج إلى الحصول على نموذج Character للمستخدم من أجل اكتشاف متى يموتون. يتم إضافة هذا النموذج فقط إلى التجربة بعد تحميل كائن Player ويمكنك استخدام حدث CharacterAdded للاستماع عندما يكون الشخصية جاهزة للاستخدام. أنشئ دالة تسمى onCharacterAdded مع معاملين: واحد للشخصية، وآخر للاعب.


local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")

على الرغم من أنك تضمّنت المستخدم في معاملات دالة onCharacterAdded، إلا أن حدث CharacterAdded يعيد فقط الشخصية، وليس المستخدم المرتبط. لتمرير كائن player أيضًا، استخدم دالة غير مسماة لربط الاتصال بالحدث.


local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end

إعادة تعيين النقاط

عندما يموت أحد المستخدمين، يقوم Humanoid بإطلاق حدث Died تلقائيًا. يمكنك استخدام هذا الحدث لمعرفة متى يجب إعادة تعيين نقاطهم.

توجد الهمانويد داخل نموذج الشخصيات، ولكن محتويات هذا النموذج يتم تجميعها فقط عندما يظهر المستخدم. لجعل الكود الخاص بك ينتظر بأمان لظهور كائن الهمانويد، استخدم وظيفة WaitForChild(). يمكنك استدعاؤها على أي كائن أب، مع تمرير اسم السلسلة للطفل الذي تنتظر إليه. أنشئ متغيرًا لانتظار الهمانويد باستخدام character:WaitForChild("Humanoid").


local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
end

الدالة التي تحتاج إلى ربطها بحدث Died هي قصيرة جدًا ولن تُستخدم في أي مكان آخر، لذا يمكنك استخدام دالة غير مسماة مرة أخرى.

  1. اربط دالة غير مسماة جديدة بحدث الهمانويد Died.
  2. في الدالة الغير مسماة، أنشئ متغيرًا يسمى points لكائن Points الخاص باللاعب.
  3. قم بتعيين خاصية Value لـ points إلى 0.

local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
end)
end

اختبر هذا وسترى درجة المستخدم تعود إلى الصفر عندما يموتون.

تحقق من اللاعب

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

تحتاج إلى البدء بتعريف سمة في دالة onPlayerAdded يمكن استخدامها للتحقق مما إذا كان المستخدم على قيد الحياة. في هذه المرحلة، ليس المستخدم بعد على قيد الحياة ولم يولد، حيث لا يزال نموذج شخصيتهم بحاجة إلى الإضافة.

تسمح لك السمات بتخصيص الكائنات في Roblox ببياناتك الخاصة. تتكون السمة من اسم وقيمة. يمكنك إنشاء واحدة على أي كائن باستخدام وظيفة SetAttribute. اتصل بـ SetAttribute على player لإنشاء سمة جديدة تسمى "IsAlive" بالقيمة false.


local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end

بمجرد أن يتم إعادة ظهور نموذج شخصية المستخدم، يلزم تغيير قيمة IsAlive إلى true حتى يمكن للمستخدم البدء في كسب النقاط مرة أخرى.

  1. في onCharacterAdded، قم بتعيين سمة IsAlive لـ player إلى true.
  2. في onCharacterDied، قم بتعيين سمة IsAlive لـ player إلى false.

local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end

أخيرًا، يجب التحقق من IsAlive قبل منح أي نقطة في while loop في نهاية السكريبت. تأخذ وظيفة GetAttribute اسم سمة وتعيد القيمة. في حلقة while، حوّط الكود الذي يمنح نقطة في جملة if بشرط player:GetAttribute("IsAlive").


while true do
task.wait(1)
local playerList = Players:GetPlayers()
for currentPlayer = 1, #playerList do
local player = playerList[currentPlayer]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
end

اختبر تجربتك الآن ويجب أن تجد المستخدم يكسب نقاطًا كل ثانية يكون فيها على قيد الحياة، وتظل عند 0 عندما لا يكون على قيد الحياة. انتقل مع أصدقائك وانظر من يمكنه الحصول على أعلى درجة.

هذه مجرد البداية: يمكنك الاستمرار في تحسين تجربتك لمستخدميك. إليك بعض النصائح:

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

الكود النهائي


local Players = game:GetService("Players")
local function onCharacterAdded(character, player)
player:SetAttribute("IsAlive", true)
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
local points = player.leaderstats.Points
points.Value = 0
player:SetAttribute("IsAlive", false)
end)
end
local function onPlayerAdded(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local points = Instance.new("IntValue")
points.Name = "Points"
points.Value = 0
points.Parent = leaderstats
player:SetAttribute("IsAlive", false)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(character, player)
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
while true do
task.wait(1)
local playerList = Players:GetPlayers()
for i = 1, #playerList do
local player = playerList[i]
if player:GetAttribute("IsAlive") then
local points = player.leaderstats.Points
points.Value += 1
end
end
end
©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.