Menu
CoddyTech

Pedane rimbalzanti

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

La fase Bounce ha una pedana verde, contrassegnata con Bounce, sotto una sporgenza troppo alta per saltarci sopra. Atterrando sulla pedana dovresti essere lanciato in aria fin sopra la sporgenza.

Un personaggio si muove con il suo HumanoidRootPart, la parte invisibile al centro. Imposta la AssemblyLinearVelocity di quella parte e il personaggio volerà in quella direzione, poi la gravità lo farà scendere:

root.AssemblyLinearVelocity = Vector3.new(0, 60, 0) -- 60 stud al secondo, verso l'alto in linea retta

Touched ti fornisce l'arto che ha colpito la pedana, di solito una gamba. Il suo genitore è il personaggio, che contiene l'HumanoidRootPart.

challenge icon

Sfida

Medio
  1. Scrivi bounce(hit): se il modello di chi tocca ha un HumanoidRootPart, imposta la sua AssemblyLinearVelocity su Vector3.new(0, Settings.BouncePower, 0).
  2. In setupStage, collega l'evento Touched di ogni parte contrassegnata con Bounce a questa funzione.

Premi Play, atterra sul pad e dirigiti verso la sporgenza. Poi premi Check.

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

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

-- Ogni giocatore riceve 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)

-- Qualsiasi cosa contrassegnata con 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 vi 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 allo spostamento 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

-- Gli elementi rotanti girano un po' a ogni fotogramma
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 di 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
	end
end

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

-- Posiziona una copia di un modello in cima alla torre; restituisce la copia e la nuova altezza della cima
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)
end

buildTower()
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