Menu
CoddyTech

Marches escamotables

Leçon 6 sur 18 du cours Jeu Roblox : tour sans fin de Coddy.

Les marches en verre portant l’étiquette Vanish s’effacent peu après qu’on a posé le pied dessus, puis réapparaissent. On peut traverser une pièce dont la propriété CanCollide est désactivée, et avec une Transparency élevée, elle semble avoir disparu :

part.Transparency = 0.8
part.CanCollide = false

L’événement Touched se déclenche pour chaque membre qui touche la marche, puis à nouveau quand on passe à travers. Sans vérification, chaque contact déclenche son propre fondu, et la marche clignote longtemps après votre départ. Un anti-rebond ne laisse passer que le premier contact : marquez la marche pendant qu’elle est occupée et ignorez les contacts tant que la marque est présente.

if part:GetAttribute("Gone") then
	return
end
part:SetAttribute("Gone", true)
-- disparaître progressivement, attendre, réapparaître
part:SetAttribute("Gone", nil)

L’attente se déroule dans la fonction Touched, que Roblox exécute de son côté, de sorte qu’elle ne ralentit jamais le reste du jeu.

challenge icon

Défi

Moyen

Écrivez makeVanish(part) et utilisez-le pour chaque élément portant la balise Vanish dans setupStage. Lorsqu’un élément touché par un Humanoid n’a pas déjà disparu :

  1. Définissez l’attribut Gone sur true.
  2. Attendez Settings.VanishDelay, puis définissez Transparency sur 0.8 et CanCollide sur false.
  3. Attendez Settings.VanishTime, puis rétablissez leurs valeurs à 0 et true, et effacez Gone (définissez-le sur nil).

Appuyez sur Play et continuez à avancer. Puis cliquez 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 Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil

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

-- Chaque joueur reçoit des 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

-- Les éléments Spinner 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 tous les obstacles d’une étape selon leurs tags
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
	end
end

-- Une étape choisie 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()
quiz iconTestez-vous

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