Menu
CoddyTech

El girador

Lección 5 de 18 del curso Juego de Roblox: Torre infinita de Coddy.

La etapa Spinner tiene un brazo rojo que barre la pasarela. Es un Model, etiquetado como Spinner, cuyo pivote es su eje. Girar todo el Model un poco en cada fotograma hace que gire.

RunService.Heartbeat se activa una vez en cada fotograma y pasa dt, los segundos transcurridos desde el último fotograma (aproximadamente 1/60). Girar speed * dt en cada fotograma suma speed cada segundo, sin importar a qué velocidad se ejecute el juego.

Un CFrame es una posición más una rotación. Multiplicarlo por CFrame.Angles lo hace girar, y los ángulos están en radianes, así que convierte los grados con math.rad:

spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(90) * dt, 0))

CollectionService:GetTagged("Spinner") enumera todo lo que lleva la etiqueta, incluidas las plantillas en ServerStorage, así que gira solo las que están en el espacio de trabajo. El brazo tiene la etiqueta Kill, así que ya acaba con una vida. En esta lección, cada etapa es un Spinner.

challenge icon

Desafío

Intermedio
  1. Cerca de la parte superior, obtén CollectionService y RunService con game:GetService.
  2. Conecta RunService.Heartbeat. En cada fotograma, para cada Model etiquetado como Spinner que esté en el espacio de trabajo, cambia su pivote mediante CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0).

Pulsa Play y calcula el momento para pasar junto al brazo, o salta por encima. Después, Check.

Pruébalo tú mismo

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil

print("Each tower has " .. Settings.StageCount .. " stages")

-- Cada jugador obtiene 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

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