Menu
CoddyTech

לחץ כדי לשבור

שיעור 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: סימולטור חיות מחמד