Menu
CoddyTech

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 arriba

Touched te da la extremidad que golpeó la plataforma, normalmente una pierna. Su elemento principal es el personaje, que contiene el HumanoidRootPart.

challenge icon

Desafío

Intermedio
  1. Escribe bounce(hit): si el modelo de quien toca tiene un HumanoidRootPart, establece su AssemblyLinearVelocity en Vector3.new(0, Settings.BouncePower, 0).
  2. En setupStage, conecta el evento Touched de cada parte etiquetada como Bounce a 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()
quiz iconPonte a prueba

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