Plataformas de rebote
Lección 9 de 18 del curso Juego de Roblox: Torre infinita de Coddy.
La etapa Bounce tiene una plataforma verde, etiquetada como Bounce, debajo de una cornisa demasiado alta para saltar hasta ella. Al aterrizar en la plataforma, esta debería impulsarte hacia arriba hasta la cornisa.
Un personaje se mueve con su HumanoidRootPart, la parte invisible que tiene en el centro. Establece la AssemblyLinearVelocity de esa parte y el personaje saldrá volando en esa dirección; después, la gravedad lo hará caer:
root.AssemblyLinearVelocity = Vector3.new(0, 60, 0) -- 60 studs por segundo, directamente hacia arribaTouched te da la extremidad que golpeó la plataforma, normalmente una pierna. Su elemento principal es el personaje, que contiene el HumanoidRootPart.
Desafío
Intermedio- Escribe
bounce(hit): si el modelo de quien toca tiene unHumanoidRootPart, establece suAssemblyLinearVelocityenVector3.new(0, Settings.BouncePower, 0). - En
setupStage, conecta el evento Touched de cada parte etiquetada comoBouncea esta función.
Pulsa Play, aterriza en la plataforma y dirígete hacia el saliente. 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 cosa 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 peldaño que desaparece se desvanece poco después de que alguien lo pisa 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
-- Los Spinners 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
end
end
-- Una etapa cualquiera, elegida 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