Menu
CoddyTech

מדרגות נעלמות

שיעור 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 מריצה באופן עצמאי, ולכן היא לעולם לא מעכבת את שאר המשחק.

challenge icon

אתגר

בינוני

כתבו makeVanish(part) והשתמשו בה עבור כל חלק שמתויג בתור Vanish בתוך setupStage. כשמשהו שיש לו Humanoid נוגע במדרגה והיא עדיין לא נעלמה:

  1. הגדירו את המאפיין Gone לערך true.
  2. המתינו Settings.VanishDelay, ואז הגדירו את Transparency לערך 0.8 ואת CanCollide לערך false.
  3. המתינו 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()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Roblox: מגדל אינסופי