قم ببرمجة زر الترقية

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


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

إنشاء زر الترقية

تتكون واجهات المستخدم ثنائية الأبعاد في Roblox عادةً من مجموعة من مكونات واجهة المستخدم الرسومية داخل حاوية واجهة المستخدم. في هذه الحالة، تحتاج فقط إلى مكون TextButton الذي يقول "ترقية القفز (5 عملات)" داخل حاوية ScreenGui.

إعداد واجهة المستخدم لزر الترقية

في ReplicatedStorage، قم بإنشاء مجلد باسم Instances.
داخل مجلد Instances، قم بإنشاء ScreenGui باسم JumpPurchaseGui مع تعطيل ResetOnSpawn.
داخل JumpPurchaseGui، قم بإنشاء TextButton باسم JumpButton مع الخصائص التالية:
- النص: "ترقية القفز (5 عملات)"
- حجم النص: 25
- نقطة الارتساء: 1، 1
- الموضع: {1، 0}، {1، 0}
أيضًا داخل مجلد Instances، قم بإنشاء RemoteFunction باسم IncreaseJumpPowerFunction.
أخيرًا، في خدمة StarterPlayer، قم بتمكين خاصية CharacterUseJumpPower.

تعريف بيانات قوة القفز

في الوقت الحالي، يتم تخزين عدد العملات فقط لكل لاعب في نص برنامج PlayerData. تحتاج أيضًا إلى تخزين وتحديث قوة القفز بنفس الطريقة. لأن الدوال في PlayerData غير محددة بالبيانات التي يتم تغييرها، كل ما هو مطلوب لتخزين قوة قفز اللاعب هو إضافة مفتاح Jump وتهيئة قيمته الأولية في defaultPlayerData().

تحديث PlayerData بقوة القفز

في ServerStorage، استبدل شفرة PlayerData ModuleScript الموجودة بالشيفرة التالية:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
PlayerData.JUMP_KEY_NAME = "Jump"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number,
["Jump"] = jumpPower: number
}
--]]
}
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0,
[PlayerData.JUMP_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 قادرة على تتبع قوة القفز، تحتاج إلى تنفيذ منطق على الخادم لترقية قوة القفز بناءً على طلب عميل اللاعب.

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

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

إنشاء JumpService

في ServerScriptService، قم بإنشاء نص باسم JumpService مع الشيفرة التالية:
```lua
-- الخدمات
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- الوحدات
local Leaderboard = require(ServerStorage.Leaderboard)
local PlayerData = require(ServerStorage.PlayerData)
-- الأحداث
local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAME
local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
local JUMP_POWER_INCREMENT = 30
local JUMP_COIN_COST = 5
local function updateJumpPower(player, updateFunction)
-- تحديث جدول قوة القفز
local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
-- تحديث قوة القفز للاعبين
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.JumpPower = newJumpPower
-- تحديث لوحة الصدارة للقفز
Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)
end
end
local function onPurchaseJumpIncrease(player)
local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)
if coinAmount < JUMP_COIN_COST then
return false
end
-- زيادة قوة قفز اللاعب
updateJumpPower(player, function(oldJumpPower)
oldJumpPower = oldJumpPower or 0
return oldJumpPower + JUMP_POWER_INCREMENT
end)
-- تحديث جدول العملات
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
return oldCoinAmount - JUMP_COIN_COST
end)
-- تحديث لوحة الصدارة للعملات
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
return true
end
local function onCharacterAdded(player)
-- إعادة تعيين قوة قفز اللاعب عند إضافة الشخصية
updateJumpPower(player, function(_)
return 0
end)
end
-- تهيئة أي لاعبين تم إضافتهم قبل الاتصال بحدث PlayerAdded
for _, player in Players:GetPlayers() do
onCharacterAdded(player)
end
-- التهيئة العادية للاعبين من حدث PlayerAdded
local function onPlayerAdded(player)
player.CharacterAdded:Connect(function()
onCharacterAdded(player)
end)
end
local function onPlayerRemoved(player)
updateJumpPower(player, function(_)
return nil
end)
end
IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncrease
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoved)
```

تصف الأقسام التالية الشيفرة بمزيد من التفصيل.

  • تحديث بيانات قوة القفز - updateJumpPower() يقوم بتحديث قوة القفز للاعب ولوحة الصدارة لتوفير ملاحظات بصرية. تشبه هذه الدالة الشيفرة التي تلحق الضرر باللاعبين في إنشاء مخاطر اللاعبين. نظراً لوجود نموذج Character وHumanoid للاعب الذي يتم ترقيته، تقوم الوظيفة بتحديث خاصية JumpPower إلى القيمة الجديدة المخزنة بواسطة PlayerData، مما يزيدها بمقدار 30. إذا كنت تريد أن تدوم لعبتك لفترة أطول قليلاً، يمكنك تقليل هذا الرقم.

  • تحقق من صحة طلبات الخادم - تقوم onPurchaseJumpIncrease() أولاً بالتحقق مما إذا كان لدى اللاعب العدد الفعلي من العملات المطلوبة لشراء الترقية. يجب التحقق من صحة جميع الطلبات من العملاء إلى الخادم لمنع المتسللين من تقديم طلبات زائفة واستغلال لعبتك.

إضافة الزر إلى واجهة اللاعب

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

إنشاء JumpButtonClickHandler

في ReplicatedStorage، قم بإنشاء نص باسم JumpButtonClickHandler مع ضبط RunContext على Client والشيفرة التالية:
```lua
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local playerGui = player.PlayerGui
local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
local jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGui
local jumpButton = jumpPurchaseGui.JumpButton
local function onButtonClicked()
local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)
if not success then
-- ستكون purchased هي رسالة الخطأ إذا كانت success خاطئة
error(purchased)
elseif success and not purchased then
warn("ليس لديك عملات كافية!")
end
end
jumpButton.Activated:Connect(onButtonClicked)
-- أضف JumpPurchaseGui إلى واجهة اللاعب
jumpPurchaseGui.Parent = playerGui
```

تصف الأقسام التالية الشيفرة بمزيد من التفصيل.

  • الحصول على مراجع لواجهة المستخدم والدالة الخادمية - تحتوي المتغيرات IncreaseJumpPowerFunction وjumpPurchaseGui وjumpButton على مراجع للدالة وواجهة المستخدم التي تستدعي الدالة التي ستحتاجها لاحقًا.
  • تعريف معالج الحدث - تقوم onButtonClicked() بتعريف المنطق عندما ينقر المستخدمون على زر الترقية. تستخدم pcall() (نداء محمي) لاستدعاء RemoteFunction. يتطلب أي تواصل بين العميل والخادم مثل هذا استخدام pcall() للتعامل مع الأخطاء أو مشاكل الاتصال.
  • اتصال المعالج بالزر - حدث Activated متوافق على جميع الأنظمة الأساسية، بما في ذلك الماوس، والشاشة اللمسية، أو أدوات التحكم في الألعاب. يتم تفعيله عند النقر، اللمس، أو عند الاطلاق على زر التحكم.

اختبار اللعبة

اختر Test من القائمة المنسدلة وانقر على Play. يظهر زر ترقية القفز في الزاوية السفلى اليمنى.

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

مع اكتمال الشيفرة، حاول ضبط الصعوبة: أضف عملات إذا شعرت أن الوتيرة بطيئة، أو قم بإزالة البعض وتخبئتها في أماكن أصعب إذا كانت الترقيات تأتي بسهولة كبيرة.

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