Menu
CoddyTech
flag Ar iconالعربيةdown icon

انقر للتحطيم

الدرس 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)

يصل الحدث البعيد بعد لحظة، كما يحدث عبر الشبكة. وعلى الهاتف، تكون النقرة باللمس هي نفسها النقرة.

challenge icon

التحدي

متوسط
  1. في PetClient: local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). عند الضغط على Button1Down في الفأرة، إذا كان mouse.Target جزءًا اسمه CoinPile، فأرسل remotes.Hit معه.
  2. في 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Roblox: محاكي الحيوانات الأليفة