انقر للتحطيم
الدرس 6 من 18 في دورة لعبة Roblox: محاكي الحيوانات الأليفة على Coddy.
يُعدّ ClickDetector مناسبًا لزر، لكن معظم ألعاب المحاكاة تقرأ النقرات على العميل، لذا يمكن للعبة أن تستجيب لحظة النقر (بصوت أو اهتزاز) قبل أن يردّ الخادم. يعرف الماوس لدى العميل ما الذي نقر عليه:
local mouse = me:GetMouse()
mouse.Button1Down:Connect(function()
print(mouse.Target) -- الجزء الذي نُقر عليه، أو nil
end)لا يستطيع العميل تكسير كومة بنفسه: فالخادم يملك الأكوام والعملات. يطلب ذلك عبر RemoteEvent، وهو كائن مُصمّم لإرسال الرسائل بين العميل والخادم:
-- العميل
remotes.Hit:FireServer(pile)
-- الخادم: يضيف Roblox اللاعب الذي أرسل الطلب أولًا
remotes.Hit.OnServerEvent:Connect(function(player, pile)
end)يصل الحدث البعيد بعد لحظة، كما يحدث عبر الشبكة. وعلى الهاتف، تكون النقرة باللمس هي نفسها النقرة.
التحدي
متوسط- في
PetClient:local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). عند الضغط علىButton1Downفي الفأرة، إذا كانmouse.Targetجزءًا اسمهCoinPile، فأرسلremotes.Hitمعه. - في
PetServer:local remotes = game.ReplicatedStorage.Remotes، وصّلremotes.Hit.OnServerEventلاستدعاءhitPile(player, pile)، وأزِل ClickDetector منspawnPile(وسطرlocal hitPile: اكتبlocal function hitPileتحت spawnPile بدلًا منه).
اضغط Play وانقر على كومة. ثم اضغط Check.
جرّب بنفسك
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local piles = workspace.Piles
local pileSpot = {} -- كل كومة -> الموضع الذي تقف عليه
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- يحصل كل لاعب على Coins في لوحة المتصدرين
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Parent = leaderstats
end)
-- يتطلب النقر على الكومة hitPile، المكتوبة بعد spawnPile: لذا عرّفها
-- هنا، قبل أيٍّ منهما
local hitPile
-- كومة عملات على موضع: نسخة من ServerStorage.CoinPile مع صحتها
-- وقيمتها بوصفهما خاصيتين
local function spawnPile(spot)
local pile = ServerStorage.CoinPile:Clone()
pile.Position = spot.Position
pile:SetAttribute("MaxHealth", Settings.PileHealth)
pile:SetAttribute("Health", Settings.PileHealth)
pile:SetAttribute("Value", Settings.PileValue)
-- انقر عليها لضربها
local detector = Instance.new("ClickDetector")
detector.Parent = pile
pileSpot[pile] = spot
pile.Parent = piles
detector.MouseClick:Connect(function(player)
hitPile(player, pile)
end)
return pile
end
-- تُنقص الضربة 1 من صحة الكومة؛
-- عند 0 تتحطم الكومة وتمنح قيمتها
function hitPile(player, pile)
local health = pile:GetAttribute("Health") - 1
if health > 0 then
pile:SetAttribute("Health", health)
return
end
player.leaderstats.Coins.Value += pile:GetAttribute("Value")
local spot = pileSpot[pile]
pileSpot[pile] = nil
pile:Destroy()
-- كومة جديدة في الموضع نفسه بعد بضع ثوانٍ
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- كومة على كل موضع في Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.