לחץ כדי לשבור
שיעור 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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.