פעם אחת בכל הנפה
שיעור 4 מתוך 20 בקורס משחק Roblox: זירות קרב של Coddy.
מכה אחת הורידה לבובת האימון 30 נקודות. השורש, הרגליים והראש שלה הם שלושה חלקים שנמצאים כולם בתוך התיבה, וכל אחד מהם פגע באותו Humanoid.
טבלה פותרת את הבעיה: זוכרים כל Humanoid שהמכה הזאת פגעה בו, ומדלגים על מי שכבר ראינו. המפתחות של טבלה יכולים להיות מופעים:
local hit = {}
if humanoid and not hit[humanoid] then
hit[humanoid] = true
-- פגע בו פעם אחת
endהטבלה נוצרת בתוך swing, כך שכל מכה מתחילה עם טבלה ריקה, ושני אויבים שנמצאים בתוך התיבה נפגעים פעם אחת כל אחד.
אתגר
קלבתוך swing, צור local hit = {} לפני הלולאה, ופגע ב-Humanoid רק אם הוא עדיין לא נמצא בתוך hit, וסמן אותו כשאתה עושה זאת.
לחץ על Play, ואז על Check.
נסו בעצמכם
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> מתי הניף את החרב בפעם האחרונה
-- אנימציות החרב של Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- הנפת חרב: האנימציה מופעלת, ואז כל מי שנמצא בתיבה שלפניך נפגע
local function swing(player)
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if not root or character.Humanoid.Health <= 0 then
return
end
local now = time()
if lastSwing[player] and now - lastSwing[player] < Settings.SwingCooldown then
return
end
lastSwing[player] = now
character.Humanoid.Animator:LoadAnimation(slash):Play()
-- התיבה שלפניך, אף פעם לא הגוף שלך
local params = OverlapParams.new()
params.FilterDescendantsInstances = { character }
local box = root.CFrame * CFrame.new(0, 0, -3)
for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid:TakeDamage(Settings.SwordDamage)
end
end
end
-- כל שחקן מקבל Kills בטבלת המובילים, וחרב בכל פעם שהוא נולד מחדש
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local kills = Instance.new("IntValue")
kills.Name = "Kills"
kills.Parent = leaderstats
player.CharacterAdded:Connect(function()
local sword = ServerStorage.Sword:Clone()
sword.Parent = player.Backpack
sword.Activated:Connect(function()
swing(player)
end)
end)
end)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.