להגיע לפסגה
שיעור 13 מתוך 18 בקורס משחק Roblox: מגדל אינסופי של Coddy.
ה־FinishPad המוזהב בראש המגדל מסיים את הטיפוס: ניצחון, ונסיעה חזרה ללובי. stack מחזירה את ה־Finish שהיא הציבה, אז חבר את האירוע Touched של המשטח שלה שם.
האירוע Touched מופעל פעם אחת עבור כל איבר, ולכן בלי זהירות נחיתה אחת תגרום לניצחון שלוש או ארבע פעמים. שמור טבלה של מי כבר סיים בסיבוב הזה, ותן לכל שחקן לנצח פעם אחת:
local finished = {}
if finished[player] then
return
end
finished[player] = trueטבלה יכולה להשתמש באובייקט Player כמפתח שלה, ולכן finished[player] היא הרשומה של אותו שחקן. בתחילתו של סיבוב חדש, רוקן את הטבלה כדי שכולם יוכלו לנצח שוב.
אתגר
בינוני- ליד החלק העליון:
local lobbySpawn = workspace.Lobby.SpawnLocationו-local finished = {}. - כתוב את
reachTop(hit): מצא את השחקן; אם אין שחקן או שהוא כבר סיים, עצור. אחרת סמן שהוא סיים, הוסף 1 ל-Wins שלו, הדפסName reached the top(ה-Name שלו), והעבר את הדמות שלו לגובה 4 studs מעלlobbySpawn. - ב-
buildTower, שמור את Finish שמוחזר מ-stackוחבר אתFinishPad.Touchedשלו ל-reachTop. - ב-
startRound, התחל עםfinished = {}.
במגדל של השיעור הזה יש 2 שלבים. לחץ על Play ונצח. לאחר מכן לחץ על Check.
נסו בעצמכם
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 towerStages = {}
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)
-- הלוח בלובי
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.Lobby.Board
local boardLabel = Instance.new("TextLabel")
boardLabel.Name = "Status"
boardLabel.Size = UDim2.fromScale(1, 1)
boardLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
boardLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
boardLabel.TextScaled = true
boardLabel.Text = "Endless Tower"
boardLabel.Parent = gui
local function setBoard(text)
boardLabel.Text = text
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
towerStages = {}
local top = 0
for i = 1, Settings.StageCount do
local stage, newTop = stack(pickStage(), top)
top = newTop
setupStage(stage)
towerStages[i] = 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 function startRound()
local top = buildTower()
startLava(top)
for _, player in Players:GetPlayers() do
if player.Character then
player.Character:PivotTo(towerStages[1].Start.CFrame + Vector3.new(0, 4, 0))
end
end
end
-- סיבוב אחד
for i = Settings.Intermission, 1, -1 do
setBoard("Next tower in " .. i)
task.wait(1)
end
startRound()
for i = Settings.RoundLength, 1, -1 do
setBoard("Climb! " .. i .. " seconds left")
task.wait(1)
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.