LearnBlox

Solutions des défis du week-end

Les 3 défis du fichier defi-du-week-end.rbxl, du Facile au Difficile : chaque script réparé et expliqué.

Pas encore le fichier des défis ? Télécharge-le dans le kit gratuit.

Avant de lire. Tu as trouvé une autre façon de faire et ton parcours marche jusqu’au trophée ? Alors ta solution est bonne aussi. Ici, on montre la plus simple, et surtout pourquoi elle marche.

Les lignes surlignées sont celles qu’il fallait changer.

Défi Facile

Facile · 1/3

La plateforme fantôme

Quand tu cliques sur Play, Output affiche cette ligne rouge :

CanColide is not a valid member of Part "Workspace.DefiDuWeekEnd.Facile.Etape1.PlateformeFantome"

Roblox ne connaît pas de propriété CanColide : il manque un l. Le bon nom est CanCollide. Mais corriger le nom ne suffit pas : il faut aussi changer les deux valeurs.

local plateforme = script.Parent plateforme.Transparency = 0plateforme.CanCollide = true

À retenir. Roblox respecte l’orthographe et les majuscules à la lettre : CanCollide, pas CanColide ni cancollide. Quand tu tapes un nom, Studio te propose la suite : choisir dans la liste évite ces fautes.

Facile · 2/3

Le pont qui clignote

Output affiche :

Workspace.DefiDuWeekEnd.Facile.Etape2.Pont.Script:8: Expected identifier when parsing expression, got '?'

Luau n’arrive même pas à lire le script à cause des ???, alors aucune ligne ne tourne. Il fallait les remplacer par deux mots : while pour répéter, et task.wait pour faire une pause.

local pont = script.Parent while true do	pont.Transparency = 0	pont.CanCollide = true	task.wait(3)	pont.Transparency = 0.8	pont.CanCollide = false	task.wait(1)end

À retenir. Une boucle while true a toujours besoin d’un task.wait() dedans. Sans pause, elle tourne si vite que Studio se fige.

Facile · 3/3

La porte d’énergie

Output affiche :

Touch is not a valid member of Part "Workspace.DefiDuWeekEnd.Facile.Etape3.Bouton"
Script 'Workspace.DefiDuWeekEnd.Facile.Etape3.Bouton.Script', Line 18

La ligne 18 utilise Touch, qui n’existe pas. L’événement qui se déclenche quand quelque chose touche une Part s’appelle Touched.

local function toucher(hit)	local humanoid = hit.Parent:FindFirstChild("Humanoid")	if humanoid then		porte.Transparency = 1		porte.CanCollide = false	endend bouton.Touched:Connect(toucher)

À retenir. La ligne rouge d’Output donne le numéro de la ligne fautive. C’est toujours le premier endroit où regarder.

Défi Moyen

Moyen · 1/4

L’escalier

Pas de ligne rouge : le script tourne, mais seules 4 marches apparaissent sur 8. Impossible d’atteindre le haut.

La boucle for i = 1, 4 s’arrête à 4. Il y a 8 marches (Marche1 à Marche8) : il faut aller jusqu’à 8.

local escalier = script.Parent for i = 1, 8 do	local marche = escalier["Marche" .. i]	marche.Transparency = 0	marche.CanCollide = true	task.wait(0.3)end

À retenir. Le 2e nombre d’un for est le dernier tour. Compte les objets à traiter dans l’Explorer.

Moyen · 2/4

Le pont à code

Workspace.DefiDuWeekEnd.Moyen.Etape2.Bouton.Script:11: Incomplete statement: expected assignment or a function call

Ligne 11, compteur + 1 calcule une valeur mais ne la range nulle part. Pour augmenter le compteur, il faut le réaffecter avec =.

bouton.ClickDetector.MouseClick:Connect(function()	compteur = compteur + 1	print("Clics : " .. compteur)	if compteur == 3 then		pont.Transparency = 0		pont.CanCollide = true	endend)

À retenir. Une variable ne change que si on écrit variable = ….

Moyen · 3/4

Le pont trop bas

Pas de ligne rouge : le pont est bien placé, mais à 10 de haut, alors que le dessus des plateformes est à 36.

Dans Vector3.new(x, y, z), c’est y la hauteur. Le pont fait 1 d’épaisseur : avec y = 35.5, son dessus arrive pile à 36.

local pont = script.Parent pont.Position = Vector3.new(140, 35.5, 0)

Tu as mis 35 ou 36 ? Ça marche aussi : une marche de 0,5 ne gêne pas.

À retenir. Pour trouver la bonne valeur, sélectionne une plateforme et lis sa Position dans Properties.

Moyen · 4/4

Les vraies pierres

Pas de ligne rouge : ce sont les pierres « Fausse » qui deviennent solides, et elles ne permettent pas de traverser.

La condition teste le mauvais nom. Il faut rendre solides les pierres qui s’appellent Vraie.

for _, pierre in zone:GetChildren() do	if pierre:IsA("BasePart") then		if pierre.Name == "Vraie" then			pierre.CanCollide = true		else			pierre.CanCollide = false		end	endend

À retenir. Quand le résultat est l’inverse de ce que tu veux, regarde la condition : c’est souvent elle qui est à l’envers.

Défi Difficile

Difficile · 1/5

L’ascenseur

L’ascenseur descend et ne remonte jamais. Le script tourne sans erreur, mais les deux boucles font la même chose : -0.25, c’est descendre.

while true do	for i = 1, 40 do		ascenseur.Position = ascenseur.Position + Vector3.new(0, -0.25, 0)		task.wait(0.03)	end	task.wait(2)	for i = 1, 40 do		ascenseur.Position = ascenseur.Position + Vector3.new(0, 0.25, 0)		task.wait(0.03)	end	task.wait(2)end

À retenir. Sans ligne rouge, observe ce qui se passe et compare avec ce que tu voulais, ligne par ligne.

Difficile · 2/5

L’interrupteur

Le pont s’allume et s’éteint au hasard quand tu marches sur la plaque. Touched se déclenche plusieurs fois à chaque pas (un pied, l’autre, la jambe…), et chaque fois le pont change d’état.

La solution : une variable attente qui ignore les touchers pendant 1 seconde après le premier.

local allume = falselocal attente = false plaque.Touched:Connect(function(hit)	if hit.Parent:FindFirstChild("Humanoid") and not attente then		attente = true		allume = not allume		if allume then			pont.Transparency = 0			pont.CanCollide = true		else			pont.Transparency = 0.8			pont.CanCollide = false		end		task.wait(1)		attente = false	endend)

À retenir. C’est l’« anti-rebond » (debounce en anglais). Dès qu’un Touched ne doit agir qu’une fois, il en faut un.

Difficile · 3/5

Le passage secret

La fonction ouvrirPassage est bien écrite, mais personne ne l’appelle. Une fonction ne fait rien tant qu’on ne l’exécute pas.

local function ouvrirPassage()	for i = 1, 3 do		local morceau = passage["Morceau" .. i]		morceau.Transparency = 0		morceau.CanCollide = true		task.wait(0.5)	endend ouvrirPassage()

À retenir. local function nom() range la recette. nom() la lance.

Difficile · 4/5

Le compte à rebours

Le pont apparaît et disparaît aussitôt. La boucle for i = 10, 1 ne tourne jamais : sans pas indiqué, for avance de +1, et on ne va pas de 10 à 1 en montant.

	for i = 10, 1, -1 do		ecran.Text = i		task.wait(1)	end

À retenir. Pour compter à l’envers, il faut toujours un pas négatif.

Difficile · 5/5

À toi d’écrire

Il fallait écrire tout le script. Voici une solution :

local plaque = script.Parentlocal pont = workspace.DefiDuWeekEnd.Difficile.Etape5.Pont plaque.Touched:Connect(function(hit)	if hit.Parent:FindFirstChild("Humanoid") then		pont.Transparency = 0		pont.CanCollide = true	endend)

Ton script est différent mais le pont apparaît ? C’est gagné. Une fonction nommée comme au défi Facile 3, ou une fonction écrite directement dans Connect comme ici : les deux sont justes.

À retenir. Tu viens d’écrire un script de jeu en partant de rien. C’est exactement ce qu’on fait pour créer un jeu Roblox.

Bonus

Pour aller plus loin

Ton parcours marche ? Essaie de le modifier :

  1. Donne une couleur à la plateforme fantôme : plateforme.Color = Color3.fromRGB(255, 120, 60).
  2. Rends le pont plus difficile : il reste là 2 secondes au lieu de 3.
  3. Fais refermer la porte 3 secondes après son ouverture :
	if humanoid then		porte.Transparency = 1		porte.CanCollide = false		task.wait(3)		porte.Transparency = 0		porte.CanCollide = true	end

La suite, avec Bloxi

Tu viens d’utiliser les propriétés, les boucles, les compteurs, les fonctions et les événements. Les Bases de LearnBlox reprennent tout ça en détail, gratuitement, avec Bloxi pour t’aider quand tu bloques.

Voir les formations