Menu
CoddyTech

הלוח

שיעור 11 מתוך 18 בקורס משחק Roblox: מגדל אינסופי של Coddy.

משחק obby מתנהל בסבבים: המתנה קצרה בלובי, ואז מגדל חדש ומרוץ אל הפסגה. השחקנים צריכים לראות מה קורה, ולכן בלובי יש Board, חלק שטוח הפונה אל נקודת ההופעה.

טקסט על חלק הוא SurfaceGui שמכיל TextLabel. UDim2.fromScale(1, 1) גורם לתווית למלא את כל המשטח, ו-TextScaled מתאים את גודל המילים כך שיתאימו:

local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.Lobby.Board

local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.TextScaled = true
label.Text = "Endless Tower"
label.Parent = gui

ספירה לאחור היא לולאת for שסופרת לאחור בצעדים של ‎-1, וממתינה שנייה בכל פעם:

for i = 5, 1, -1 do
	setBoard("Next tower in " .. i)
	task.wait(1)
end
challenge icon

אתגר

בינוני
  1. הוסף SurfaceGui ל־workspace.Lobby.Board ובתוכו TextLabel בשם Status שממלא אותו, עם TextScaled מופעל, טקסט לבן על רקע כהה.
  2. כתוב את setBoard(text), שמגדירה את ה־Text של התווית.
  3. לפני בניית המגדל, בצע ספירה לאחור מ־Settings.Intermission עד 1, והצג Next tower in 3, Next tower in 2, ... תוך המתנה של שנייה בכל פעם. לאחר מכן בנה את המגדל והפעל את הלבה כבעבר.

לחץ על הפעלה וצפה בלוח. לאחר מכן לחץ על בדיקה.

נסו בעצמכם

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil
local lava = 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

-- מדרגה נעלמת דוהה זמן קצר אחרי שמישהו נוחת עליה, ואז חוזרת
local function makeVanish(part)
	part.Touched:Connect(function(hit)
		if part:GetAttribute("Gone") or not hit.Parent:FindFirstChild("Humanoid") then
			return
		end
		part:SetAttribute("Gone", true)
		task.wait(Settings.VanishDelay)
		part.Transparency = 0.8
		part.CanCollide = false
		task.wait(Settings.VanishTime)
		part.Transparency = 0
		part.CanCollide = true
		part:SetAttribute("Gone", nil)
	end)
end

-- קרן לייזר נעה אל ההיסט Slide שלה ובחזרה, ללא הפסקה
local function makeSlide(part)
	local info = TweenInfo.new(Settings.SlideTime, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, true)
	local goal = { Position = part.Position + part:GetAttribute("Slide") }
	TweenService:Create(part, info, goal):Play()
end

-- משטח קפיצה מעיף לאוויר את מי שנוחת עליו
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 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
		if part:HasTag("Vanish") then
			makeVanish(part)
		end
		if part:HasTag("Conveyor") then
			part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeed
		end
		if part:HasTag("Slider") then
			makeSlide(part)
		end
		if part:HasTag("Bounce") then
			part.Touched:Connect(bounce)
		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)
	return top
end

-- הלבה עולה מהקרקע עד מעט מתחת לראש המגדל
local function startLava(top)
	lava = Instance.new("Part")
	lava.Name = "Lava"
	lava.Anchored = true
	lava.CanCollide = false
	lava.Size = Vector3.new(30, 2, 30)
	lava.Position = Vector3.new(0, -2, 0)
	lava.Color = Color3.fromRGB(255, 90, 20)
	lava.Material = Enum.Material.Neon
	lava.Parent = workspace
	lava.Touched:Connect(killOnTouch)
	local info = TweenInfo.new(top / Settings.LavaSpeed, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)
	TweenService:Create(lava, info, { Position = Vector3.new(0, top - 2, 0) }):Play()
end

local top = buildTower()
startLava(top)
quiz iconבחנו את עצמכם

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

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