Ateliers de 3h · Multijoueur · Progression pédagogique
Défi 01 : La Course aux Portes
Dans un couloir géant, des portes colorées s’ouvrent ou se ferment en fonction d’une condition secrète à définir au lancement de la partie (nombre pair, tous les x, couleur, niveau de transparence, type de matériaux de la porte …). La mauvaise porte téléporte en début de partie.
Règles du jeu
- 2 à 6 joueurs simultanés sur le même serveur
- Chaque manche dure 90 secondes — le premier à passer 5 portes gagne
- Une mauvaise porte = retour en début de partie
- Si possible les indices changent aléatoirement à chaque manche et l’accès aux bonnes portes
- Un tableau de score (Leaderboard) est visible de tous et montre le nombre de bonnes portes ouvertes et le nombre de parties gagnées
Techniques Lua abordées
- Variables locales/globales : Stocker la couleur de la porte et le score du joueur
- Instruction if/elseif/else : Tester la condition de la bonne porte
- Gérer dynamiquement et aléatoirement les propriétés des Parts
- RemoteEvents : Communiquer entre le serveur et les clients
- Leaderboard (Leaderstats) : Afficher les scores de tous les joueurs
- ClickDetector pour l’ouverture des portes
- Gérer les ressources du workspace (script.Parent, :GetChildren(), if part:IsA(« BasePart »)
- Boucle
for _, enfant in ipairs(dossier:GetChildren()) do
print(enfant.Name)
end
Compétences acquises
- Déclarer et utiliser des variables
- Écrire des conditions simples et imbriquées
- Comprendre la différence Server/Client
- Créer un système de score multijoueur
QCM de validation — 4 questions
1. En Lua, quelle instruction permet de tester une condition ?
- A. check
- B. if
- C. test
- D. when
2. Comment déclare-t-on une variable locale en Lua ?
- A. var score = 0
- B. let score = 0
- C. local score = 0
- D. int score = 0
3. Quel objet Roblox permet d’afficher le score de tous les joueurs ?
- A. ScoreBoard
- B. Leaderstats
- C. PlayerGUI
- D. DataStore
4. Que se passe-t-il si la condition d’un if est fausse et qu’il y a un else ?
- A. Le script s’arrête
- B. La condition est retestée
- C. Le bloc else est exécuté
- D. Une erreur apparaît
Défi 02 : Le Labyrinthe Fantôme
Des murs du labyrinthe, ou un chemin de plateformes apparaissent et disparaissent par cycles réguliers, comme des fantômes. Les joueurs doivent mémoriser et anticiper. Un joueur « Fantôme » (désigné aléatoirement) voit tous les murs en transparence et peut guider les autres via un chat.
Règles du jeu
- 1 Fantôme (voit tout) + 1 à 5 Chasseurs (voient un brouillard)
- Les murs disparaissent ou réapparaissent toutes les 3 secondes
- Le Fantôme doit guider les Chasseurs jusqu’à la sortie en 2 minutes
- Si un Chasseur touche un mur plein, il revient au départ
- Bonus si toute l’équipe sort ensemble
Techniques Lua abordées
- Boucle while true do : Faire clignoter les murs indéfiniment
- task.wait(n) : Contrôler la durée entre chaque clignotement
- Propriété Transparency : Rendre les murs visibles/invisibles
- CanCollide : Activer/désactiver la collision des murs
- Lire tous les joueurs local Players = game:GetService(« Players ») Players.PlayerAdded:Connect(function(player)
Compétences acquises
- Comprendre le fonctionnement client/serveur
- Gérer les RemoteEvent
- Créer des boucles infinies contrôlées
- Manipuler les propriétés des Parts Roblox
- Concevoir un mécanisme de jeu temporisé
- Comprendre CanCollide et Transparency
QCM de validation — 4 questions
1. Quelle boucle Lua tourne indéfiniment jusqu’à ce qu’on l’arrête ?
- A. for i=1,10
- B. repeat until
- C. while true do
- D. loop forever
2. Que fait wait(3) dans un script Roblox ?
- A. Attend l’appui d’une touche
- B. Pause l’exécution 3 secondes
- C. Répète une action 3 fois
- D. Crée un délai de 0,3 s
3. Quelle propriété rend un objet traversable sans le rendre invisible ?
- A. Transparency = 1
- B. CanCollide = false
- C. Anchored = true
- D. Locked = true
4. Comment accède-t-on à la propriété d’un objet Roblox en Lua ?
- A. objet->propriete
- B. objet.propriete
- C. objet[propriete]
- D. get(objet, propriete)
Défi 03 : Roi de la Plateforme
Une grande plateforme centrale se rétrécit progressivement grâce au TweenService. Des blocs se déplacent ou tournent sur cette plateforme et poussent les joueurs. Ceux qui tombent sont éliminés. Le dernier joueur debout devient le Roi et gagne des points. Les joueurs éliminés doivent attendre en spectateur, qu’il ne reste plus qu’un seul joueur présent sur la plateforme, pour recommencer une nouvelle partie.
La difficulté augmente : les blocs se déplacent de plus en plus vite.
Règles du jeu
- 2 à 8 joueurs par partie
- La plateforme perd 10% de sa taille toutes les 15 secondes
- Un joueur éliminé peut regarder la partie en spectateur
- Victoire = survivre jusqu’à la fin et être le dernier avec le plus de points
- 3 manches par session, le total des Points compte pour la victoire finale
Techniques Lua abordées
- Fonctions nommées : Organiser le code en blocs réutilisables
- TweenService : Animer la réduction de la plateforme
- Touched event : Détecter quand un joueur tombe dans le vide
- Boucle for numérique : Compter les manches et les cycles de rétrécissement
Compétences acquises
- Déclarer et appeler des fonctions
- Utiliser TweenService pour des animations
- Connecter des événements (Touched)
- Structurer un jeu en manches avec boucle for
QCM de validation — 4 questions
1. Comment appelle-t-on une fonction nommée ‘demarrer’ en Lua ?
- A. call demarrer()
- B. run:demarrer()
- C. demarrer()
- D. execute(demarrer)
2. Quel service Roblox permet de créer des animations fluides ?
- A. AnimationService
- B. TweenService
- C. SmoothService
- D. TransitionService
3. Comment s’écrit une boucle for qui compte de 1 à 5 en Lua ?
- A. for(i=0; i<5; i++)
- B. for i in range(5)
- C. for i = 1, 5 do
- D. repeat 5 times
4. Quel événement détecte qu’un objet touche une Part Roblox ?
- A. .OnTouch
- B. .Touched:Connect
- C. .Hit:Bind
- D. Contact:Link
Défi 04 : La Bombe Logique
Une bombe virtuelle affiche un chrono avant son explosion. Elle raccordée par une séquence de fils de couleurs tirée au hasard. Les joueurs doivent couper les fils dans la bonne séquence. Chaque joueur reçoit une partie du code sur son écran (GUI), et doit communiquer avec les autres pour coordonner la séquence exacte de câbles à couper avant que le chrono n’atteigne zéro.
Règles du jeu
- 3 à 5 joueurs requis (chaque joueur voit 1/3 du code)
- La bombe explose si le mauvais câble est coupé
- 30 secondes maximum pour désamorcer
- Code différent à chaque partie (aléatoire)
Techniques Lua abordées
- Tables (tableaux) : Stocker la séquence de couleurs de la bombe
- math.random() : Générer la séquence aléatoire à chaque partie
- ScreenGui / Frame : Afficher les indices à chaque joueur
- ipairs / pairs : Parcourir la table des couleurs
Compétences acquises
- Créer et manipuler des tables Lua
- Utiliser math.random pour l’aléatoire
- Créer une interface joueur (GUI)
- Itérer avec ipairs sur une liste
QCM de validation — 4 questions
1. Comment crée-t-on une table vide en Lua ?
- A. table = []
- B. table = new Table()
- C. table = {}
- D. table = list()
2. Quelle fonction ajoute un élément à la fin d’une table ?
- A. table.push()
- B. table.add()
- C. table.append()
- D. table.insert()
3. Que retourne math.random(1, 6) ?
- A. Toujours 1
- B. Un nombre décimal entre 1 et 6
- C. Un entier aléatoire entre 1 et 6
- D. La somme 1+6
4. Quelle boucle est faite pour parcourir une table indexée en Lua ?
- A. while
- B. for k,v in pairs
- C. for i,v in ipairs
- D. foreach
Défi 05 : Ascenseur Infernal
Les joueurs fabriquent, dans un espace dédié, un ascenseur fonctionnel qui monte et descend entre différents étages. Chaque étage contient des obstacles différents. Le joueur programme lui-même la vitesse, les arrêts et les comportements des obstacles à chaque palier et un objet à trouver. Un mini concours final compare les ascenseurs de tous les participants.
Règles du jeu
- Travail individuel avec présentation finale en groupe
- L’ascenseur doit desservir au minimum 3 étages
- Chaque étage doit avoir un obstacle scripté différent
- Le joueur doit pouvoir appuyer sur un bouton pour appeler l’ascenseur
- Bonus : ajouter une porte qui s’ouvre à l’arrivée
Compétences acquises
- Manipuler CFrame et Vector3 pour le déplacement
- Utiliser les Welds pour solidariser des objets
- Créer des interactions ProximityPrompt
- Organiser des données dans une table d’étages
QCM de validation — 4 questions
1. Qu’est-ce que CFrame représente dans Roblox ?
- A. La couleur d’un objet
- B. La position ET l’orientation d’un objet
- C. La taille d’une Part
- D. Le nom d’un script
2. À quoi sert un WeldConstraint entre deux Parts ?
- A. Les rendre invisibles
- B. Les coller ensemble pour qu’elles bougent solidairement
- C. Les faire tomber en même temps
- D. Les fusionner en une seule Part
3. Comment crée-t-on un point 3D à X=5, Y=10, Z=0 en Lua Roblox ?
- A. Point(5,10,0)
- B. Vector3.new(5,10,0)
- C. CFrame.new(5,10,0)
- D. Pos3D(5,10,0)
4. Quel objet Roblox crée une interaction ‘Appuyer sur E’ dans le monde ?
- A. ButtonPart
- B. ClickDetector
- C. ProximityPrompt
- D. TouchButton
Défi 06 : Sauve-qui-peut !
Un joueur est désigné « Monstre » avec une vitesse boostée. Les autres doivent traverser un OBBY classique tout en étant poursuivis. Des zones de ralentissement, de vitesse boost, et de gravité réduite sont scriptées dans l’arène. Si le Monstre te touche, tu deviens Monstre à ton tour ! Le jeu s’arrête lorsque les joueurs sont tous des monstres ou au bout d’un certain temps.
Règles du jeu
- Monstre pour commencer, désigné aléatoirement
- Les survivants gagnent 1 point par checkpoint franchi
- Un survivant tagué devient immédiatement Monstre
- Le dernier survivant gagne un bonus x3
- Partie de 3 minutes max
Techniques Lua abordées
- Humanoid.WalkSpeed : Modifier la vitesse du Monstre et des joueurs
- Humanoid.JumpPower : Ajuster la hauteur de saut dans les zones spéciales
- workspace.Gravity : Créer des zones de gravité réduite
- GetPlayers() : Récupérer tous les joueurs pour désigner le Monstre
Compétences acquises
- Modifier les propriétés du Humanoid
- Sélectionner un joueur aléatoire depuis GetPlayers()
- Créer des zones d’effet avec Touched
- Comprendre la physique Roblox (vitesse, gravité)
QCM de validation — 4 questions
1. Quelle propriété du Humanoid contrôle la vitesse de marche ?
- A. Humanoid.Speed
- B. Humanoid.WalkSpeed
- C. Character.Velocity
- D. Player.RunSpeed
2. Que retourne Players:GetPlayers() ?
- A. Le nombre de joueurs
- B. Le premier joueur connecté
- C. Une table de tous les joueurs connectés
- D. Le joueur local
3. Comment accède-t-on au personnage d’un joueur ?
- A. player.Model
- B. player.Character
- C. player.Avatar
- D. player.Body
4. Qu’est-ce que workspace.Gravity contrôle ?
- A. La couleur du ciel
- B. La force de gravité sur tous les objets
- C. La vitesse du vent
- D. La taille des joueurs
Défi 07 : Le Voleur de Flag
Deux équipes (Rouge et Bleue) s’affrontent dans un OBBY en miroir. Chaque équipe doit traverser l’OBBY adverse, voler le flag ennemi et le ramener à sa base. Des pièges scriptés bloquent les chemins selon l’équipe du joueur. Le flag est un objet physique que le personnage « porte » grâce à un Weld. Le jeu se termine quand une équipe ramène le flag à un endroit déterminé.
Règles du jeu
- 2 équipes de 2 à 4 joueurs chacune
- Pour marquer, le joueur doit ramener le flag sans mourir
- Les pièges changent d’état toutes les 10 secondes
Techniques Lua abordées
- Teams Service :; Créer et assigner des équipes Rouge/Bleue
- ObjectValue / BoolValue : Savoir qui porte le flag (valeur partagée)
- RemoteEvent (FireAllClients) : Annoncer une capture à tous les joueurs
- Weld dynamique : Attacher le flag au personnage qui le ramasse
Compétences acquises
- Configurer le système Teams de Roblox
- Partager des données entre Server et Clients
- Créer des Welds dynamiques par script
- Utiliser FireAllClients pour des annonces globales
QCM de validation — 4 questions
1. Comment vérifier l’équipe d’un joueur en Lua Roblox ?
- A. player.Color
- B. player.Group.Name
- C. player.Team.Name
- D. player.Side
2. Quelle valeur Roblox permet de stocker une référence à un objet ?
- A. StringValue
- B. ObjectValue
- C. NumberValue
- D. ReferenceValue
3. Que fait RemoteEvent:FireAllClients() ?
- A. Envoie un signal au serveur
- B. Envoie un signal à un seul joueur
- C. Envoie un signal à tous les joueurs connectés
- D. Crée un nouvel événement
4. Comment créer un nouvel objet Roblox par script ?
- A. new Instance(‘WeldConstraint’)
- B. Instance.new(‘WeldConstraint’)
- C. create(‘WeldConstraint’)
- D. Roblox.new(‘WeldConstraint’)
Défi 08 : Puzzle Coopératif
Un OBBY avec des portes géantes qui ne s’ouvrent que si PLUSIEURS joueurs appuient simultanément sur des boutons répartis dans des zones différentes. Le niveau est impossible à finir seul. Des scripts de détection comptent les joueurs sur chaque bouton et déclenchent l’ouverture seulement quand le bon nombre est atteint.
Règles du jeu
- 3 à 5 joueurs requis (portes à 2, 3 joueurs simultanés)
- Les boutons restent actifs 5 secondes maximum
- Si un joueur lâche son bouton, tout le monde doit recommencer
- Des checkpoints communs sauvegardent la progression collective
- Fin = tous les joueurs arrivent ensemble à la salle finale
Techniques Lua abordées
- BindableEvent : Communiquer entre scripts locaux du serveur
- Compteur de joueurs : Détecter combien de joueurs sont sur un bouton
- Fonctions modulaires : Organiser le code en modules réutilisables
- BoolValue partagée : Synchroniser l’état ouvert/fermé des portes
Compétences acquises
- Utiliser des compteurs et variables d’état
- Coordonner plusieurs scripts avec BindableEvent
- Concevoir une logique coopérative
- Structurer du code modulaire et réutilisable
QCM de validation — 4 questions
1. Quelle est la différence entre BindableEvent et RemoteEvent ?
- A. Aucune différence
- B. BindableEvent = serveur→serveur, RemoteEvent = serveur↔client
- C. BindableEvent = client→client uniquement
- D. RemoteEvent ne fonctionne qu’en studio
2. Comment incrémenter un compteur de 1 en Lua ?
- A. compteur++
- B. compteur += 1
- C. compteur = compteur + 1
- D. increment(compteur)
3. Que retourne hit.Parent:FindFirstChild(‘Humanoid’) si absent ?
- A. Une erreur
- B. false
- C. nil
- D. 0
4. Pour qu’une porte détecte l’événement d’un autre script, on utilise ?
- A. .OnServerEvent
- B. .Event:Connect
- C. .Listen()
- D. .Subscribe()
Défi : 09 Arène des pièges
Chaque joueur crée un piège dans l’arène (lame rotative, boule de feu, zone électrique) puis tous jouent ensemble sur la carte collective. Le créateur du piège qui élimine le plus d’adversaires gagne. Les pièges doivent utiliser des patterns de mouvement différents (oscillation, rotation, trajectoire). Chaque joueur crée une zone bonus protégée par les pièges pour permettre la sortie de l’arène.
Règles du jeu
- Phase 1 (45 min) : chaque joueur code son piège dans sa zone
- Phase 2 : les pièges sont assemblés dans une arène commune
- Chaque élimination rapporte 2 points au créateur du piège
- Atteindre une une zone de bonus 10 points
- Obtenir plus de 30 points permet de sortir de l’arène
Techniques Lua abordées
- TakeDamage() : Infliger des dégâts au Humanoid au contact
- CFrame rotation : Faire tourner un piège sur lui-même
- math.sin() oscillation : Créer un mouvement de va-et-vient fluide
- Respawn personnalisé : Réapparaître à un spawn aléatoire
Compétences acquises
- Infliger et gérer les points de vie (TakeDamage)
- Animer avec RunService.Heartbeat
- Créer des mouvements avec math.sin et CFrame
- Concevoir et partager ses propres mécaniques
QCM de validation — 4 questions
1. Quelle méthode inflige des dégâts à un Humanoid ?
- A. Humanoid.Health -= 10
- B. Humanoid:Hurt(10)
- C. Humanoid:TakeDamage(10)
- D. Humanoid.DealDamage(10)
2. Que fait RunService.Heartbeat:Connect(function(dt) … end) ?
- A. Lance le jeu au démarrage
- B. Exécute la fonction à chaque frame
- C. Attend 1 seconde puis exécute
- D. Connecte deux serveurs
3. math.sin(t) retourne des valeurs entre :
- A. 0 et 1
- B. -1 et 1
- C. -180 et 180
- D. 0 et 360
4. CFrame.Angles(0, math.pi, 0) représente une rotation de :
- A. 90° sur l’axe Y
- B. 360° sur l’axe X
- C. 180° sur l’axe Y
- D. 45° sur tous les axe
Défi 10 : Le Grand OBBY Final
Projet final d’atelier : les joueurs assemblent tous les mécanismes appris dans un OBBY. Chaque stage reprend une technique (portes, labyrinthes, plateformes, pièges). Les progrès sont sauvegardés dans un DataStore pour qu’un joueur puisse reprendre où il s’est arrêté. Un leaderboard global classe tous les participants de la session.
Règles du jeu
- OBBY solo mais visible par tous les autres joueurs en temps réel
- Reprise de tous les 9 scénarios + un boss final
- Chaque stage complété est sauvegardé en DataStore
- Timer global affiché pour tout le serveur
- Cérémonie de fin : podium animé avec les 3 meilleurs temps
Techniques Lua abordées
- DataStoreService : Sauvegarder la progression du joueur entre sessions
- Checkpoint system : Respawn au dernier stage sauvegardé
- ModuleScript : Centraliser le code réutilisé dans des modules
- Intégration complète : Combiner toutes les techniques précédentes
Compétences acquises
- Utiliser DataStoreService pour la persistance
- Architecturer un projet Roblox complet
- Utiliser des ModuleScripts pour organiser le code
- Combiner toutes les compétences Lua acquises
QCM de validation — 4 questions
1. À quoi sert le DataStoreService ?
- A. Sauvegarder des données entre les sessions de jeu
- B. Stocker les scripts du jeu
- C. Gérer les animations des personnages
- D. Envoyer des données au client
2. Quelle est la clé utilisée pour identifier un joueur de façon unique ?
- A. player.Name
- B. player.DisplayName
- C. player.UserId
- D. player.AccountId
3. Qu’est-ce qu’un ModuleScript dans Roblox ?
- A. Un script qui se lance automatiquement
- B. Un script qui retourne des fonctions réutilisables
- C. Un script réservé aux admins
- D. Un script qui gère les animations
4. Que fait store:SetAsync(cle, valeur) ?
- A. Lit une valeur dans le DataStore
- B. Efface une valeur du DataStore
- C. Sauvegarde une valeur dans le DataStore
- D. Vérifie si une clé existe
