Menu
CoddyTech

Papan

Pelajaran 11 dari 18 dalam kursus Game Roblox: Menara Tanpa Akhir di Coddy.

Sebuah obby berlangsung dalam beberapa ronde: menunggu sebentar di lobi, lalu menara baru dan perlombaan menuju puncak. Pemain perlu melihat apa yang sedang terjadi, jadi lobi memiliki Board, sebuah bagian datar yang menghadap ke titik spawn.

Teks pada sebuah bagian adalah SurfaceGui yang memuat TextLabel. UDim2.fromScale(1, 1) membuat label memenuhi seluruh permukaan, dan TextScaled menyesuaikan ukuran kata agar pas:

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

Hitung mundur adalah for loop yang menghitung mundur dengan langkah -1 dan menunggu satu detik setiap kali:

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

Tantangan

Sedang
  1. Tempatkan SurfaceGui pada workspace.Lobby.Board yang memuat TextLabel bernama Status yang memenuhi seluruh area, dengan TextScaled aktif dan teks putih dengan latar belakang gelap.
  2. Tulis setBoard(text), yang mengatur Text label.
  3. Sebelum membangun menara, lakukan hitung mundur dari Settings.Intermission hingga 1, dengan menampilkan Next tower in 3, Next tower in 2, ... dan menunggu satu detik setiap kali. Lalu bangun menara dan mulai lava seperti sebelumnya.

Tekan Play dan amati papan. Lalu tekan Check.

Coba sendiri

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")

-- Setiap pemain mendapat Wins di papan peringkat
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)

-- Apa pun yang memiliki tag Kill mengakhiri nyawa pemain
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Pijakan yang menghilang memudar sesaat setelah seseorang mendarat di atasnya, lalu muncul kembali
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

-- Laser bergeser ke posisi offset Slide lalu kembali, terus-menerus
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

-- Landasan pelontar melempar siapa pun yang mendarat di atasnya ke udara
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
	end
end

-- Spinner berputar sedikit pada setiap frame
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)

-- Aktifkan setiap rintangan dalam sebuah tahap berdasarkan tag-nya
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

-- Pilih tahap secara acak
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Letakkan salinan model di atas menara; kembalikan salinan dan posisi puncak yang baru
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

-- Bangun menara baru secara acak dari bawah ke atas
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

-- Lava naik dari tanah hingga tepat di bawah puncak menara
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Roblox: Menara Tanpa Akhir

Latihan sendiri: Playground Roblox