Le plateau
Leçon 11 sur 18 du cours Jeu Roblox : tour sans fin de Coddy.
Un obby se déroule en manches : une courte attente dans le lobby, puis une nouvelle tour et une course jusqu’au sommet. Les joueurs doivent voir ce qui se passe, alors le lobby possède un Board, une pièce plate orientée vers le point d’apparition.
Le texte sur une pièce est un SurfaceGui contenant un TextLabel. UDim2.fromScale(1, 1) fait en sorte que l’étiquette remplisse toute la face, et TextScaled ajuste la taille des mots pour qu’ils tiennent :
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.Lobby.Board
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.TextScaled = true
label.Text = "Endless Tower"
label.Parent = guiUn compte à rebours est une boucle for qui compte à rebours par pas de -1, en attendant une seconde à chaque fois :
for i = 5, 1, -1 do
setBoard("Next tower in " .. i)
task.wait(1)
endDéfi
Moyen- Place un SurfaceGui sur
workspace.Lobby.Boardcontenant un TextLabel nomméStatusqui le remplit, avec TextScaled activé, un texte blanc sur un fond sombre. - Écris
setBoard(text), qui définit le Text du libellé. - Avant de construire la tour, fais un compte à rebours de
Settings.Intermissionjusqu’à 1, en affichantNext tower in 3,Next tower in 2, ... et en attendant une seconde à chaque fois. Puis construis la tour et démarre la lave comme avant.
Appuie sur Play et observe le tableau. Puis clique sur Check.
Essayez vous-même
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
local lava = nil
print("Each tower has " .. Settings.StageCount .. " stages")
-- Chaque joueur reçoit Wins dans le classement
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)
-- Tout élément portant le tag Kill met fin à une vie
local function killOnTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- Une marche escamotable s’estompe peu après qu’un joueur y a atterri, puis réapparaît
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 glisse jusqu’au décalage Slide, puis revient, indéfiniment
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
-- Un tremplin propulse dans les airs quiconque atterrit dessus
local function bounce(hit)
local root = hit.Parent:FindFirstChild("HumanoidRootPart")
if root then
root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
end
end
-- Les éléments rotatifs tournent un peu à chaque image
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)
-- Active chaque obstacle d’une étape selon ses tags
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
-- Choisis une étape au hasard
local function pickStage()
local all = stages:GetChildren()
return all[math.random(1, #all)]
end
-- Place une copie d’un modèle au sommet de la tour ; renvoie la copie et la nouvelle hauteur du sommet
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
-- Construis une nouvelle tour aléatoire de bas en haut
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)
return top
end
-- La lave monte depuis le sol jusqu’à juste en dessous du sommet de la tour
local function startLava(top)
lava = Instance.new("Part")
lava.Name = "Lava"
lava.Anchored = true
lava.CanCollide = false
lava.Size = Vector3.new(30, 2, 30)
lava.Position = Vector3.new(0, -2, 0)
lava.Color = Color3.fromRGB(255, 90, 20)
lava.Material = Enum.Material.Neon
lava.Parent = workspace
lava.Touched:Connect(killOnTouch)
local info = TweenInfo.new(top / Settings.LavaSpeed, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)
TweenService:Create(lava, info, { Position = Vector3.new(0, top - 2, 0) }):Play()
end
local top = buildTower()
startLava(top)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.