الآن بعد أن يمكنك اكتشاف متى يجمع اللاعبون عملة، تحتاج إلى حساب عدد العملات التي جمعها اللاعبون وجعل ذلك المبلغ مرئيًا على لوحة الصدارة.
أنشئ نص برمجي للوحدة لتسجيل جمع العملات
لإدارة تخزين البيانات وإدارتها لكل بيانات جمع العملات الخاصة باللاعب، تحتاج إلى إنشاء كائن ModuleScript يحتوي على هيكل بيانات ووظائف تصل إلى بيانات جمع العملات لكل لاعب. نصوص الوحدات هي شيفرة قابلة لإعادة الاستخدام يمكن لنصوص أخرى الطلب منها. في هذه الحالة، يطلب CoinService هذا النص البرمجي لوحدة حتى يتمكن من تحديث بيانات جمع العملات عندما يلمس اللاعبون العملات.
إنشاء PlayerDataفي ServerStorage، أنشئ ModuleScript باسم PlayerData مع الشيفرة التالية:```lualocal PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local function defaultPlayerData()return {[PlayerData.COIN_KEY_NAME] = 0}endlocal function getData(player)local data = playerData[tostring(player.UserId)] or defaultPlayerData()playerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn 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 مع الشيفرة التالية:```lualocal Leaderboard = {}-- إنشاء لوحة صدارة جديدةlocal function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 'leaderstats' هو اسم محجوز يعرفه Roblox لإنشاء لوحة صدارةleaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- إنشاء قيمة جديدة للاحصاءات في لوحة الصدارةlocal function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- تحديث قيمة احصاءات اللاعبfunction Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn 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.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local 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") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- لمس اللاعب لعملةcoin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- إعداد مستمعي الأحداثfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
تشمل التغييرات على نص CoinService الأصلي ما يلي:
- إعلان COIN_AMOUNT_TO_ADD كعدد العملات التي سيتم إضافتها عندما يجمع اللاعب عملة، و COIN_KEY_NAME كاسم المفتاح المحدد في PlayerData.
- إنشاء وظيفة مساعدة updatePlayerCoins() لتحديث عدد العملات الخاص باللاعب وإحصائيات لوحة الصدارة المرتبطة بذلك.
- استبدال جملة print() النمطية في onCoinTouched() بدعوة إلى updatePlayerCoins().
اختبار اللعب
اختر اختبار من القائمة المنسدلة وانقر على تشغيل. امشِ إلى عملة وتأكد من ظهور لوحة الصدارة في الزاوية وزيادة عدد العملات لديك مع جمع المزيد من العملات.