سجل وعرض بيانات اللاعبين

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


الآن بعد أن يمكنك اكتشاف متى يجمع اللاعبون عملة، تحتاج إلى حساب عدد العملات التي جمعها اللاعبون وجعل ذلك المبلغ مرئيًا على لوحة الصدارة.

أنشئ نص برمجي للوحدة لتسجيل جمع العملات

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

إنشاء PlayerData

في ServerStorage، أنشئ ModuleScript باسم PlayerData مع الشيفرة التالية:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number
}
]]
}
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end
function PlayerData.getValue(player, key)
return getData(player)[key]
end
function PlayerData.updateValue(player, key, updateFunction)
local data = getData(player)
local oldValue = data[key]
local newValue = updateFunction(oldValue)
data[key] = newValue
return newValue
end
return PlayerData
```

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

إعلان عن هياكل البيانات

يبدأ نص الوحدة بإعلان عن جدول فارغ، PlayerData، الذي يُرجع في نهاية النص. يحتوي أيضًا على طرق وصول للحصول على القيم وتعيينها في الجدول.

يحتوي جدول playerData على تعليقات تصف هيكل الجدول، مما يجعل الشيفرة أسهل في الفهم. في هذه الحالة، يحتوي جدول playerData على userId وحقل مطابق باسم Coins يمثل كمية العملات التي تم جمعها لذلك اللاعب.


local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number
}
]]
}
...
return PlayerData

تعريف موصل بيانات محلي

getData() هي وظيفة محلية تسترجع البيانات لجداول playerData معينة. إذا لم يكن لدى اللاعب عملة، فإنها تُرجع جدولًا من وظيفة defaultPlayerData() لضمان أن كل لاعب لديه بعض البيانات المرتبطة به. من الممارسات الشائعة إنشاء وظائف بسيطة يمكن الوصول إليها بسهولة تستعين بمنطق لوظائف محلية منسقة تقوم بأعمال ثقيلة.


local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
playerData[tostring(player.UserId)] = data
return data
end

تعريف موصلات البيانات العامة

getValue() و updateValue() هما وظيفتان متاحتان للجمهور يمكن لنصوص أخرى تطلب هذا النص البرمجي أن تستدعيهما. في حالتنا، يستخدم CoinService هذه الوظائف لتحديث بيانات جمع العملات للاعب كلما لمس اللاعب عملة.


function PlayerData.getValue(player, key)
return getData(player)[key]
end
function PlayerData.updateValue(player, key, updateFunction)
local data = getData(player)
local oldValue = data[key]
local newValue = updateFunction(oldValue)
data[key] = newValue
return newValue
end

تنفيذ لوحة الصدارة

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

إنشاء لوحة الصدارة

في ServerStorage، أنشئ ModuleScript باسم Leaderboard مع الشيفرة التالية:
```lua
local Leaderboard = {}
-- إنشاء لوحة صدارة جديدة
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' هو اسم محجوز يعرفه Roblox لإنشاء لوحة صدارة
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- إنشاء قيمة جديدة للاحصاءات في لوحة الصدارة
local function setupStat(leaderstats, statName)
local stat = Instance.new("IntValue")
stat.Name = statName
stat.Value = 0
stat.Parent = leaderstats
return stat
end
-- تحديث قيمة احصاءات اللاعب
function Leaderboard.setStat(player, statName, value)
local leaderstats = player:FindFirstChild("leaderstats")
if not leaderstats then
leaderstats = setupLeaderboard(player)
end
local stat = leaderstats:FindFirstChild(statName)
if not stat then
stat = setupStat(leaderstats, statName)
end
stat.Value = value
end
return Leaderboard
```

تصف الأقسام التالية كيف تعمل لوحة الصدارة بمزيد من التفصيل.

إنشاء لوحة صدارة

تقوم وظيفة setupLeaderboard() بإنشاء مثيل مجلد جديد باسم leaderstats وتعيينه كطفل للاعب المحدد. يتعرف Roblox تلقائيًا على مجلد باسم leaderstats كحاوية للإحصائيات ويقوم بإنشاء عنصر واجهة مستخدم لعرض الإحصائيات. يتطلب تخزين القيم في leaderstats ككائنات "قيمة" (مثل StringValue, IntValue أو NumberValue).


-- إنشاء لوحة صدارة جديدة
local function setupLeaderboard(player)
local leaderstats = Instance.new("Folder")
-- 'leaderstats' هو اسم محجوز يعرفه Roblox لإنشاء لوحة صدارة
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
return leaderstats
end
-- إنشاء قيمة جديدة للاحصاءات في لوحة الصدارة
local function setupStat(leaderstats, statName)
local stat = Instance.new("IntValue")
stat.Name = statName
stat.Value = 0
stat.Parent = leaderstats
return stat
end

تحديث إحصاءات اللاعبين

setStat() هي الوظيفة العامة الوحيدة في وحدة Leaderboard. إنها تنشئ قيم احصاءات للاعب المحدد أو لوحة الصدارة نفسها إذا لم تكن موجودة بالفعل.

تقوم FindFirstChild() بأخذ اسم كائن وتعيد الكائن إذا كان موجودًا، أو nil إذا لم يكن كذلك. إنها طريقة شائعة وآمنة لمعرفة ما إذا كان الكائن موجودًا قبل استخدامه.


-- تحديث قيمة احصاءات اللاعب
function Leaderboard.setStat(player, statName, value)
local leaderstats = player:FindFirstChild("leaderstats")
if not leaderstats then
leaderstats = setupLeaderboard(player)
end
local stat = leaderstats:FindFirstChild(statName)
if not stat then
stat = setupStat(leaderstats, statName)
end
stat.Value = value
end

دمج نصوص الوحدة

مع وجود كلا الوحدتين، قم بطلبهما في نص CoinService لإدارة وعرض بيانات عملات اللاعبين.

تحديث CoinService

في ServerScriptService، استبدل الشيفرة الموجودة في نص CoinService بالشيفرة التالية:
```lua
-- تهيئة الخدمات والمتغيرات
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- الوحدات
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
local COOLDOWN = 10
local COIN_AMOUNT_TO_ADD = 1
local function updatePlayerCoins(player, updateFunction)
-- تحديث جدول العملات
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)
-- تحديث لوحة الصدارة للعملات
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
end
-- تعريف معالج الحدث
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- لمس اللاعب لعملة
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
updatePlayerCoins(player, function(oldCoinAmount)
oldCoinAmount = oldCoinAmount or 0
return oldCoinAmount + COIN_AMOUNT_TO_ADD
end)
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- إعداد مستمعي الأحداث
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```

تشمل التغييرات على نص CoinService الأصلي ما يلي:

  • استيراد وحدات PlayerData و Leaderboard باستخدام require().
  • إعلان COIN_AMOUNT_TO_ADD كعدد العملات التي سيتم إضافتها عندما يجمع اللاعب عملة، و COIN_KEY_NAME كاسم المفتاح المحدد في PlayerData.
  • إنشاء وظيفة مساعدة updatePlayerCoins() لتحديث عدد العملات الخاص باللاعب وإحصائيات لوحة الصدارة المرتبطة بذلك.
  • استبدال جملة print() النمطية في onCoinTouched() بدعوة إلى updatePlayerCoins().

اختبار اللعب

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

©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.