Menu
CoddyTech

Dentro la torre

Lezione 12 di 18 del corso Gioco Roblox: Torre infinita di Coddy.

Quando termina il conto alla rovescia, inizia il round: costruisci la torre, avvia la lava e sposta tutti i giocatori sul primo livello. Tieni i livelli in una tabella mentre li costruisci, così towerStages[1] è il livello più in basso:

towerStages[i] = stage

Un personaggio è un Model, quindi PivotTo lo sposta tutto intero. Posizionalo qualche stud sopra il pad Start, non al suo interno, e atterrerà sopra:

player.Character:PivotTo(towerStages[1].Start.CFrame + Vector3.new(0, 4, 0))

Poi il tabellone fa il conto alla rovescia del round, proprio come nella lobby.

challenge icon

Sfida

Medio
  1. Vicino all'inizio: local towerStages = {}. In buildTower, svuotala all'inizio e memorizza ogni sezione come towerStages[i] = stage.
  2. Scrivi startRound(): costruisci la torre, avvia la lava e sposta il personaggio di ogni giocatore a 4 studs sopra towerStages[1].Start.
  3. In fondo: dopo il conto alla rovescia nella lobby, chiama startRound(), poi fai il conto alla rovescia da Settings.RoundLength, mostrando Climb! 20 seconds left, Climb! 19 seconds left, ...

Premi Gioca. Poi Controlla.

Provalo tu

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

-- Ogni giocatore ottiene Wins nella classifica
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)

-- Il tabellone nella lobby
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

-- Qualsiasi cosa con il tag Kill fa perdere una vita
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Una piattaforma a scomparsa svanisce poco dopo che qualcuno ci atterra sopra, poi riappare
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

-- Un laser scorre fino alla posizione indicata da Slide e torna indietro, all'infinito
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

-- Una piattaforma rimbalzante lancia in aria chiunque ci atterri sopra
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
	end
end

-- Gli Spinner ruotano un po' a ogni 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)

-- Attiva ogni ostacolo in una fase in base ai suoi tag
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

-- Scegli una fase a caso
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Metti una copia di un modello in cima alla torre; restituisce la copia e la nuova altezza massima
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

-- Costruisci una nuova torre casuale, dal basso verso l'alto
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

-- La lava sale dal terreno fino a poco sotto la cima della torre
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

-- Fai il conto alla rovescia, poi costruisci la torre
for i = Settings.Intermission, 1, -1 do
	setBoard("Next tower in " .. i)
	task.wait(1)
end
local top = buildTower()
startLava(top)
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Roblox: Torre infinita