Lava ascendente
Lección 10 de 18 del curso Juego de Roblox: Torre infinita de Coddy.
Esperar en la parte de abajo no debería ser seguro. Una lámina de lava comienza debajo de la torre y, tras una breve demora, sube de forma constante hasta quedar a 2 studs de la parte superior, así que todos tienen que seguir escalando.
Un tween puede esperar antes de comenzar: el sexto argumento de TweenInfo.new es una demora en segundos. Para una subida constante, el tiempo del tween es la distancia dividida por la velocidad:
local seconds = top / Settings.LavaSpeed
local info = TweenInfo.new(seconds, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)La lava no es sólida (CanCollide false), así que nadie puede pararse sobre ella, y su evento Touched usa killOnTouch, la misma función que los bloques mortales. Comienza a una altura de -2 y sube hasta top - 2, exactamente top studs.
Desafío
Intermedio- Cerca de la parte superior:
local lava = nil. Haz quebuildTowerdevuelvatop. - Escribe
startLava(top): crea un Part anclado llamadoLava, que no pueda colisionar, de 30 por 2 por 30, enVector3.new(0, -2, 0), de color naranja Neon (Color3.fromRGB(255, 90, 20)), en el workspace, con Touched conectado akillOnTouch. Anima su Position hastaVector3.new(0, top - 2, 0)durantetop / Settings.LavaSpeedsegundos, con Linear, después de un retraso deSettings.LavaDelay. - Al final:
local top = buildTower()y luegostartLava(top).
La lava de esta lección es rápida, así que la comprobación es breve. Pulsa Play y después Check.
Pruébalo tú mismo
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
print("Each tower has " .. Settings.StageCount .. " stages")
-- Cada jugador recibe Wins en la tabla de clasificación
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)
-- Cualquier objeto con la etiqueta Kill acaba con una vida
local function killOnTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- Un escalón que desaparece se desvanece poco después de que alguien caiga sobre él y luego reaparece
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 láser se desliza hasta el desplazamiento Slide y vuelve, indefinidamente
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 plataforma de rebote lanza por los aires a quien caiga sobre ella
local function bounce(hit)
local root = hit.Parent:FindFirstChild("HumanoidRootPart")
if root then
root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
end
end
-- Los objetos Spinner giran un poco en cada fotograma
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)
-- Activa todos los obstáculos de una etapa según sus etiquetas
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
-- Elige una etapa al azar
local function pickStage()
local all = stages:GetChildren()
return all[math.random(1, #all)]
end
-- Coloca una copia de un modelo encima de la torre; devuelve la copia y la nueva altura máxima
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
-- Construye una nueva torre aleatoria de abajo arriba
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()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Roblox: Torre infinita
2Obstáculos
El girador