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
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
Transparency = 0: la plateforme est visible. À1, elle est invisible.CanCollide = true: elle est solide, tu peux marcher dessus. Àfalse, tu passes à travers.
À 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.
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
while true do … endrépète ce qu’il y a dedans pour toujours.task.wait(3)attend 3 secondes : le pont reste là 3 s.task.wait(1)le laisse disparu 1 s.
À retenir. Une boucle while true a toujours besoin d’un task.wait() dedans. Sans pause, elle tourne si vite que Studio se fige.
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)
Touchedse déclenche dès qu’une pièce touche le bouton.:Connect(toucher)dit à Roblox de lancer la fonctiontoucherà ce moment-là.- Dans la fonction, on vérifie qu’il y a un
Humanoid: c’est donc bien un joueur, et pas une autre pièce.
À 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
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
"Marche" .. icolle le texte et le nombre :Marche1,Marche2… jusqu’àMarche8.
À retenir. Le 2e nombre d’un for est le dernier tour. Compte les objets à traiter dans l’Explorer.
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)
- Le
printaffiche le nombre de clics dans Output : pratique pour vérifier. ==compare,=range une valeur. Ne les confonds pas.
À retenir. Une variable ne change que si on écrit variable = ….
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.
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
GetChildren()donne toutes les pierres du modèle, une par une.IsA("BasePart")saute ce qui n’est pas une pièce, comme le script lui-même.- Autre solution juste : garder
"Fausse"et inversertrueetfalse.
À 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
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
- 40 pas de 0,25, ça fait 10 : l’ascenseur va du haut (30) jusqu’à toi (20), puis remonte.
À retenir. Sans ligne rouge, observe ce qui se passe et compare avec ce que tu voulais, ligne par ligne.
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.
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.
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
- Le
-1fait compter à rebours : 10, 9, 8… 1. Avectask.wait(1), ça dure 10 secondes. - La variable
occupe, déjà là, empêche de relancer le compte à rebours pendant qu’il tourne.
À retenir. Pour compter à l’envers, il faut toujours un pas négatif.
À 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.
Pour aller plus loin
Ton parcours marche ? Essaie de le modifier :
- Donne une couleur à la plateforme fantôme :
plateforme.Color = Color3.fromRGB(255, 120, 60). - Rends le pont plus difficile : il reste là 2 secondes au lieu de 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