يمكن للاعبين الآن جمع العملات وفقدانها عندما يموتون، ولكن العملات لا تفعل شيئًا، وغالبية العالم ثلاثي الأبعاد غير متاحة بدون القدرة على القفز عاليًا جداً. يعلمك هذا القسم من البرنامج التعليمي كيفية إنهاء المنطق لتجربتك من خلال إضافة زر على الشاشة ينفق العملات لزيادة قوة القفز.
إنشاء زر الترقية
تتكون واجهات المستخدم ثنائية الأبعاد في 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 الموجودة بالشيفرة التالية:```lualocal 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,}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 قادرة على تتبع قوة القفز، تحتاج إلى تنفيذ منطق على الخادم لترقية قوة القفز بناءً على طلب عميل اللاعب.
يمكن للخادم والعميل التواصل من خلال إما 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.IncreaseJumpPowerFunctionlocal JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5local 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 thenhumanoid.JumpPower = newJumpPower-- تحديث لوحة الصدارة للقفزLeaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)endendlocal function onPurchaseJumpIncrease(player)local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)if coinAmount < JUMP_COIN_COST thenreturn falseend-- زيادة قوة قفز اللاعبupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- تحديث جدول العملاتlocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- تحديث لوحة الصدارة للعملاتLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- إعادة تعيين قوة قفز اللاعب عند إضافة الشخصيةupdateJumpPower(player, function(_)return 0end)end-- تهيئة أي لاعبين تم إضافتهم قبل الاتصال بحدث PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- التهيئة العادية للاعبين من حدث PlayerAddedlocal function onPlayerAdded(player)player.CharacterAdded:Connect(function()onCharacterAdded(player)end)endlocal function onPlayerRemoved(player)updateJumpPower(player, function(_)return nilend)endIncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)```
تصف الأقسام التالية الشيفرة بمزيد من التفصيل.
تحديث بيانات قوة القفز - updateJumpPower() يقوم بتحديث قوة القفز للاعب ولوحة الصدارة لتوفير ملاحظات بصرية. تشبه هذه الدالة الشيفرة التي تلحق الضرر باللاعبين في إنشاء مخاطر اللاعبين. نظراً لوجود نموذج Character وHumanoid للاعب الذي يتم ترقيته، تقوم الوظيفة بتحديث خاصية JumpPower إلى القيمة الجديدة المخزنة بواسطة PlayerData، مما يزيدها بمقدار 30. إذا كنت تريد أن تدوم لعبتك لفترة أطول قليلاً، يمكنك تقليل هذا الرقم.
تحقق من صحة طلبات الخادم - تقوم onPurchaseJumpIncrease() أولاً بالتحقق مما إذا كان لدى اللاعب العدد الفعلي من العملات المطلوبة لشراء الترقية. يجب التحقق من صحة جميع الطلبات من العملاء إلى الخادم لمنع المتسللين من تقديم طلبات زائفة واستغلال لعبتك.
إضافة الزر إلى واجهة اللاعب
يظهر كائن ScreenGui على الشاشة فقط إذا تم الاستناد إلى كائن PlayerGui للاعب. بشكل افتراضي، يحتوي هذا على واجهة النظام مثل نافذة الدردشة. تحتاج الآن إلى إنشاء نص في ReplicatedStorage لنسخ زر الترقية إلى واجهة كل لاعب وتنفيذ السلوك عندما يتم الضغط على الزر.
إنشاء JumpButtonClickHandlerفي ReplicatedStorage، قم بإنشاء نص باسم JumpButtonClickHandler مع ضبط RunContext على Client والشيفرة التالية:```lualocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Players = game:GetService("Players")local player = Players.LocalPlayerlocal playerGui = player.PlayerGuilocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGuilocal jumpButton = jumpPurchaseGui.JumpButtonlocal function onButtonClicked()local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)if not success then-- ستكون purchased هي رسالة الخطأ إذا كانت success خاطئةerror(purchased)elseif success and not purchased thenwarn("ليس لديك عملات كافية!")endendjumpButton.Activated:Connect(onButtonClicked)-- أضف JumpPurchaseGui إلى واجهة اللاعبjumpPurchaseGui.Parent = playerGui```
تصف الأقسام التالية الشيفرة بمزيد من التفصيل.
- الحصول على مراجع لواجهة المستخدم والدالة الخادمية - تحتوي المتغيرات IncreaseJumpPowerFunction وjumpPurchaseGui وjumpButton على مراجع للدالة وواجهة المستخدم التي تستدعي الدالة التي ستحتاجها لاحقًا.
- تعريف معالج الحدث - تقوم onButtonClicked() بتعريف المنطق عندما ينقر المستخدمون على زر الترقية. تستخدم pcall() (نداء محمي) لاستدعاء RemoteFunction. يتطلب أي تواصل بين العميل والخادم مثل هذا استخدام pcall() للتعامل مع الأخطاء أو مشاكل الاتصال.
- اتصال المعالج بالزر - حدث Activated متوافق على جميع الأنظمة الأساسية، بما في ذلك الماوس، والشاشة اللمسية، أو أدوات التحكم في الألعاب. يتم تفعيله عند النقر، اللمس، أو عند الاطلاق على زر التحكم.
اختبار اللعبة
اختر Test من القائمة المنسدلة وانقر على Play. يظهر زر ترقية القفز في الزاوية السفلى اليمنى.
حاول النقر على الزر قبل جمع أي عملات للتحقق من أنه لا يمنحك قوة قفز إضافية، ثم حاول جمع بعض العملات وانظر ما إذا كانت الترقية تعمل عند النقر مرة أخرى.
مع اكتمال الشيفرة، حاول ضبط الصعوبة: أضف عملات إذا شعرت أن الوتيرة بطيئة، أو قم بإزالة البعض وتخبئتها في أماكن أصعب إذا كانت الترقيات تأتي بسهولة كبيرة.