מטבעות על המסך
שיעור 5 מתוך 18 בקורס משחק Roblox: סימולטור חיות מחמד של Coddy.
עכשיו נעבור לצד הלקוח. PetClient הוא LocalScript בתוך ה-HUD, שהוא ScreenGui ש-Roblox מעתיק מ-StarterGui אל המסך של כל שחקן כשהוא מופיע במשחק. LocalScript פועל במכשיר של אותו שחקן, והוא יכול לזהות את השחקן שעבורו הוא פועל:
local me = game:GetService("Players").LocalPlayerהשרת מוסיף את leaderstats לשחקן זמן קצר לאחר שהוא מצטרף, ולכן הלקוח ממתין לו באמצעות WaitForChild. לאחר מכן הוא מציג את המטבעות בתווית Coins של ה-HUD, ומעדכן אותה שוב בכל פעם שהערך משתנה: האירוע Changed של IntValue מופעל עם הערך החדש.
התווית מציגה רק את מה שהשרת החליט. שינוי של Coins.Value בתוך LocalScript ישנה את התצוגה של השחקן הזה בלבד, ולא ישנה דבר בשרת.
אתגר
בינוניב-PetClient:
- קבל את
Players, אתlocal me = Players.LocalPlayerואתlocal hud = script.Parent. - המתן ל-
leaderstatsול-Coinsשבתוכו. - כתוב את
showCoins(), שמגדירה אתhud.Coins.Textל-Coins: 5(הערך), קרא לה פעם אחת וחבר אותה ל-Coins.Changed.
לחץ על 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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.