الآن بعد أن لديك عالم ثلاثي الأبعاد، حان الوقت لإضافة أول نص برمجي لك. في هذا القسم، ستقوم بإنشاء آلية جمع العملات التي تسمح للاعبين بجمع العملات وتعطيل العملات مؤقتًا بعد جمعها.
إنشاء العملات
قبل أن تتمكن من كتابة أي نص برمجي، تحتاج إلى وجود كائنات نموذجية في العالم لاستخدامها كعملاتك. مثل منصات كومة البحر التي أنشأتها في القسم السابق، يمكن أن تكون العملات كائنات بسيطة من نوع Part.
في Workspace > World، أنشئ مجلدًا جديدًا باسم Coins.
داخل مجلد Coins، أنشئ جزء أسطوانة باسم Coin مع BrickColor مضبوط على Gold، وMaterial مضبوط على Metal، وSize 0.6، 8، 4، وOrientation 90، 0، 0.
قم بتعطيل CanCollide وتمكين Anchored.
ثم قم بتكرار جزء Coin عدة مرات ووزع النسخ حول الجزيرة وعلى المنصات بحيث يمكن الوصول إليها من مستويات كومة البحر.
احتفظ بكل نسخة باسم Coin.إنشاء النص البرمجي
بعد ذلك، ستجعل العملات تستجيب للاعبين. يمكن لمحرك Roblox اكتشاف متى يلمس شيء ما عملة، لكنك تحتاج إلى استخدام نص برمجي لتحديد كيفية استجابة العملة.
في ServerScriptService، أنشئ نصًا برمجيًا باسم CoinService مع الكود التالي:
```lua
-- تهيئة الخدمات والمتغيرات
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- تعريف معالج الحدث
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)
print("اللاعب جمع العملة")
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
```الآن، كلما لمس لاعب عملة، تختفي العملة لمدة 10 ثوانٍ، وتظهر في سجل الإخراج اللاعب جمع العملة.
تصف الأقسام التالية كيفية عمل النص البرمجي بمزيد من التفصيل.
تهيئة الخدمات والمتغيرات
مثل الكثير من الكود الذي ربما كتبته في لغات أخرى، تقوم بتعريف المتغيرات التي تحتاجها لاحقًا في أعلى النص البرمجي. يقوم كودنا بما يلي:
- الحصول على مراجع لجميع العملات - بعد ذلك، يستعلم النص البرمجي عن مساحة العمل ثلاثية الأبعاد للحصول على جميع المراجع لكائنات العملات باستخدام طريقة GetChildren(). تعيد هذه الطريقة مصفوفة تحتوي على كل شيء مرتبط بالكائن الذي ترتبط به، والذي في هذه الحالة هو مجلد Workspace.World.Coins الذي أنشأته سابقًا.
- تعريف متغير عالمي - يتم استخدام متغير COOLDOWN لاحقًا لتحديد مدة تعطيل العملة بعد جمعها.
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...تعريف معالج الحدث
يقوم محرك Roblox بمحاكاة العالم ثلاثي الأبعاد جسديًا ويتعامل مع الكثير من المنطق للتعامل مع الأحداث المتعلقة بالتقديم والفيزياء والشبكات. عندما تكون مهتمًا بكتابة منطقك الخاص أثناء بعض هذه الأحداث، يمكنك الاستماع إليها والتعامل معها، بينما تترك المحرك يقوم بالباقي. في هذه الحالة، تستمع وتتعامل مع الأحداث المتعلقة بلمس العملات. يحدد النص البرمجي المنطق للتعامل مع هذا الحدث في طريقة onCoinTouched()، التي تقوم بما يلي:
- الكشف عما إذا كانت العملة مفعلة - كل Instance لديها خاصية منطقية Enabled تحدد ما إذا كان الكائن موجودًا في العالم ثلاثي الأبعاد أم لا. يمكنك الحصول على خصائص الكائنات باستخدام طريقة GetAttribute().
- الكشف عما إذا كان لاعب قد لمس العملة - إذا كانت العملة مفعلة، تستخدم الطريقة خدمة اللاعب للتحقق مما إذا كان الكائن الذي لمس العملة هو بالفعل لاعب. عند حدوث حدث اللمس، يمرر محرك Roblox الكائن الذي لمس العملة كمعامل otherPart. يتحقق النص البرمجي لمعرفة ما إذا كان والد otherPart ينتمي إلى لاعب.
- تعطيل العملة إذا لمسها لاعب، وإعادة تفعيلها بعد 10 ثوانٍ - أخيرًا، إذا لمس لاعب العملة، تقوم الطريقة بتعطيل العملة، وتنتظر 10 ثوانٍ، ثم تعيد تفعيل العملة لجمعها. يتم استخدام task.wait() بدلاً من wait() لأنه يوفر أداءً أفضل من خلال عدم إيقاف تنفيذ الكود تمامًا، مما يسمح للمهام في خيوط أخرى بالتشغيل بالتوازي.
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)
print("اللاعب جمع العملة")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
endربط معالج الحدث
ترث جميع الكائنات ثلاثية الأبعاد المحاكاة من BasePart وبالتالي لديها حدث Touched(). تقوم الحلقة التالية بربط معالج onTouchedEvent() بحدث لمس كل عملة من خلال القيام بما يلي:
- التكرار عبر جميع العملات - التكرار عبر كل من العملات باستخدام التكرار العام.
- ربط المعالج بالحدث - في كل تكرار من الحلقة، يتم تمكين العملة بشكل افتراضي، لذا فهي مرئية في العالم ثلاثي الأبعاد خلال بداية اللعبة. يتم أيضًا ربط طريقة المعالج onCoinTouched() بحدث Touched للعملة بحيث يتم تشغيلها في كل مرة يحدث فيها الحدث. عندما يكتشف المحرك لمسة، فإنه يمرر أيضًا الكائن الذي لمس الكائن، otherPart.
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
endاختبار الآلية
اختر اختبار من القائمة المنسدلة وانقر على تشغيل. حرك شخصيتك لملامسة عملة. إذا كان كل شيء يعمل، ستختفي العملة، وتظهر نافذة الإخراج اللاعب جمع العملة، وتظهر العملة مرة أخرى بعد 10 ثوانٍ.
