מדרגות נעלמות
שיעור 6 מתוך 18 בקורס משחק Roblox: מגדל אינסופי של Coddy.
מדרגות זכוכית עם התג Vanish דוהות זמן קצר אחרי שנוחתים עליהן, ואז חוזרות. עוברים דרך חלק שהערך של CanCollide שלו כבוי, וכשהערך של Transparency גבוה, הוא נראה כאילו נעלם:
part.Transparency = 0.8
part.CanCollide = falseהאירוע Touched מופעל עבור כל איבר שנוגע, ושוב כשנופלים דרך המדרגה. בלי בדיקה, כל נגיעה מתחילה תהליך דהייה משלה, והמדרגה מהבהבת זמן רב אחרי שהלכתם. מנגנון debounce מאפשר רק לנגיעה הראשונה לעבור: מסמנים את המדרגה בזמן שהיא עסוקה, ומתעלמים מנגיעות כל עוד הסימון קיים.
if part:GetAttribute("Gone") then
return
end
part:SetAttribute("Gone", true)
-- לדהות, להמתין, לחזור
part:SetAttribute("Gone", nil)ההמתנה מתרחשת בתוך פונקציית Touched, ש-Roblox מריצה באופן עצמאי, ולכן היא לעולם לא מעכבת את שאר המשחק.
אתגר
בינוניכתבו makeVanish(part) והשתמשו בה עבור כל חלק שמתויג בתור Vanish בתוך setupStage. כשמשהו שיש לו Humanoid נוגע במדרגה והיא עדיין לא נעלמה:
- הגדירו את המאפיין
Goneלערך true. - המתינו
Settings.VanishDelay, ואז הגדירו את Transparency לערך 0.8 ואת CanCollide לערך false. - המתינו
Settings.VanishTime, ואז החזירו אותם לערכים 0 ו-true, ונקו אתGone(הגדירו אותו לערך nil).
לחצו על הפעלה והמשיכו לנוע. לאחר מכן לחצו על בדיקה.
נסו בעצמכם
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local Settings = require(game.ReplicatedStorage.Settings)
local stages = ServerStorage.Stages
local tower = nil
print("Each tower has " .. Settings.StageCount .. " stages")
-- כל שחקן מקבל Wins בלוח המובילים
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Parent = leaderstats
end)
-- כל דבר עם התג Kill מסיים חיים
local function killOnTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- העצמים המסתובבים מסתובבים מעט בכל פריים
RunService.Heartbeat:Connect(function(dt)
for _, spinner in CollectionService:GetTagged("Spinner") do
if spinner:IsDescendantOf(workspace) then
spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
end
end
end)
-- הפעל את כל המכשולים בשלב לפי התגים שלהם
local function setupStage(stage)
for _, part in stage:GetDescendants() do
if part:HasTag("Kill") then
part.Touched:Connect(killOnTouch)
end
end
end
-- שלב כלשהו, באקראי
local function pickStage()
local all = stages:GetChildren()
return all[math.random(1, #all)]
end
-- מקם עותק של מודל בראש המגדל; מחזיר את העותק ואת הגובה החדש של ראש המגדל
local function stack(template, bottom)
local copy = template:Clone()
local box, size = copy:GetBoundingBox()
local lift = bottom - (box.Position.Y - size.Y / 2)
copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
copy.Parent = tower
return copy, bottom + size.Y
end
-- בנה מגדל אקראי חדש מלמטה למעלה
local function buildTower()
tower = Instance.new("Model")
tower.Name = "Tower"
tower.Parent = workspace
local top = 0
for i = 1, Settings.StageCount do
local stage, newTop = stack(pickStage(), top)
top = newTop
setupStage(stage)
end
stack(ServerStorage.Finish, top)
end
buildTower()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.