Tapis roulants
Leçon 7 sur 18 du cours Jeu Roblox : tour sans fin de Coddy.
L’étape Conveyor comporte une bande sombre, marquée Conveyor, qui te repousse dans la direction d’où tu viens. Une pièce ancrée ne bouge jamais, mais si tu lui donnes une AssemblyLinearVelocity, tout ce qui se trouve dessus est entraîné avec elle, comme sur une vraie bande.
Dans quelle direction ? Chaque pièce a une face avant, et part.CFrame.LookVector est un Vector3 d’un stud de long qui pointe vers l’extérieur. La bande a été tournée de sorte que sa face avant soit orientée vers le bas de l’allée :
part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeedUtiliser la direction propre à la pièce signifie qu’un constructeur peut orienter la bande comme il le souhaite et qu’elle fonctionnera quand même, sans modifier le script.
Défi
MoyenDans setupStage, attribue à chaque pièce portant l’étiquette Conveyor une AssemblyLinearVelocity égale à son CFrame.LookVector multiplié par Settings.BeltSpeed.
Appuie sur Jouer et marche à contre-courant du tapis. Puis Vérifie.
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 Settings = require(game.ReplicatedStorage.Settings)
local stages = ServerStorage.Stages
local tower = 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 objet 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 atterrit, 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
-- Les plateformes tournantes pivotent légèrement à 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
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)
end
buildTower()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Jeu Roblox : tour sans fin
2Obstacles
Le Tourniquet