Coder la boucle de jeu

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Avec la carte créée, il est temps de commencer à construire les scripts.Le reste de ce cours se concentrera fortement sur le scripting de tous les éléments différents de la boucle de jeu.

Configurer les scripts

La bataille royale utilisera une combinaison de scripts de module et de scripts normaux. Ci-dessous, les scripts et leurs fonctions.

Gestionnaire de jeuScript. Exécute des fonctions à partir du gestionnaire de match en utilisant des variables des paramètres du jeu
Manager de matchScript de module. Exécute des fonctions telles que l'envoi de joueurs dans une arène ou le suivi du temps dans un correspondre.
Paramètres de jeuScript de module. Stocke les variables couramment utilisées utilisées par d'autres scripts.

scriptdes paramètres de jeu

Créez un script de module nommé GameSettings pour stocker les variables utilisées par d'autres scripts, comme la durée du match et de l'intermission.Ces variables seront utilisées par le script GameManager plus tard.

  1. Dans ServerStorage , créez un dossier nommé ModuleScripts. Dans ce dossier, créez un nouveau script de module nommé GameSettings.

  2. Ouvrez les paramètres du jeu et renommez la table du module pour correspondre au nom du script.


    local GameSettings = {}
    return GameSettings
  3. Dans la table de module, ajoutez des variables pour les utilisations suivantes. Prenez votre meilleure estimation pour chaque valeur, vous pouvez toujours la modifier plus tard lorsque vous testez.

    • Durée de l'intermission - Secondes pendant lesquels les joueurs attendent avant un correspondre.
    • Durée du match - Durée d'un match en secondes.
    • Joueurs minimum - Plus petit nombre de joueurs nécessaires pour commencer.
    • Temps de transition - Temps avant et après un match en secondes. Fait la transition entre les parties de la boucle de jeu moins soudaine.

    local GameSettings = {}
    -- Variables de jeu
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

scriptde MatchManager

Le deuxième script connecté au GameManager est le MatchManager.Ce script gère des tâches comme le démarrage de la minuterie ou la réinitialisation des joueurs une fois le match terminé.

Dans MatchManager, une fonction nommée prepareGame() lance le jeu en transférant les joueurs dans le correspondre.

  1. Dans ServerStorage > ModuleScripts > ajoutez un script de module nommé MatchManager. Renommez la table du module.


    local MatchManager = {}
    return MatchManager
  2. Ajoutez une nouvelle fonction de module à MatchManager nommée prepareGame(). Incluez une déclaration d'impression pour tester le script plus tard.


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

Coder la boucle de jeu

La boucle de jeu principale sera codée dans le script GameManager en utilisant les variables vient de créer.Rappelez-vous, il y a trois phases dans la boucle de jeu : l'intermission, la compétition et le nettoyage et la réinitialiser.

scriptdu gestionnaire de jeu

Ce script est un script de serveur normal, donc mettez-le dans ServerScriptService, plutôt que dans le dossier des scripts de module.La boucle de jeu réelle sera dans une boucle while true.

  1. Dans ServerScriptService, créez un nouveau script nommé GameManager.

  2. Ajoutez une variable pour le service « ServerStorage », qui est l'endroit où se trouvent les Modulescripts.Ensuite, ajoutez une variable pour le service "Joueurs", qui sera nécessaire pour vérifier le nombre de joueurs pendant les interruptions.


    -- Services
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Pour utiliser les modules créés précédemment :

    • Définissez une variable nommée moduleScripts à l'emplacement du dossier ModuleScripts.
    • Ajoutez les variables nommées matchManager et gameSettings. Définissez chaque variable pour qu'elle requière son script respectif.

    -- Services
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Scripts de module
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. Après les variables, ajoutez une boucle while true do. Toutes les phases de la boucle de jeu iront à l'intérieur pour se répéter indéfiniment.


    -- Scripts de module
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Boucle de jeu principale
    while true do
    end

Coder l'intermission

Bien que la boucle de jeu s'exécute indéfiniment, l'intermission doit mettre la boucle en pause et ne se poursuivre que lorsque il y a suffisamment de joueurs pour un correspondre.Pour coder cette pause, incluez une boucle de répétition imbriquée pour l'intermission dans la boucle while.Cette boucle imbriquée se répétera jusqu'à ce qu'il y ait suffisamment de joueurs, en interrompant la boucle principale.Une fois qu'il y aura suffisamment de joueurs, il sortira et transférera les joueurs dans un correspondre.

Avec une boucle de répétition **** , le code dans la boucle s'exécutera au moins une fois.Contrairement à une boucle while, il ne vérifie pas sa condition jusqu'à la fin de la boucle.Cela garantit que les joueurs vont toujours dans le lobby avant un correspondre.

  1. Dans la boucle while true do, saisissez repeat et appuyez sur Enter pour autocompléter avec le mot-clé until.


    while true do
    repeat
    until
    end
  2. Vérifiez si le nombre actuel de joueurs (#Players:GetPlayers()) est supérieur ou égal à la variable minimumPlayers créée plus tôt dans le module GameSettings.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. Dans la boucle de répétition, ajoutez une déclaration d'impression indiquant que l'intermission commence.Utilisez task.wait() pour faire une pause pendant l'intermission en utilisant intermissionDuration à partir de GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Testez et vérifiez que la déclaration d'impression "Starting intermission" est affichée au moins deux fois.Voir le message deux fois prouve que la boucle de répétition n'a pas trouvé assez de joueurs et a été exécutée à nouveau.Vous devrez attendre la durée de l'intermission avant de voir le message une deuxième fois.

Conseils de dépannage

À ce stade, si vous ne vous générez pas comme prévu, essayez l'une des options suivantes.

  • task.wait() devrait être à l'intérieur de la boucle de répétition.Sans attendre, le script s'exécutera trop de fois en une seconde, surchargant Roblox Studio et causant une erreur.
  • Dans le module des paramètres de jeu, la variable intermissionDuration devrait être supérieure à 1. Si elle est inférieure, le script peut se répéter trop souvent, ce qui entraîne des problèmes de ralentissement.

Finir l'intermission

Une fois qu'il y a suffisamment de joueurs, faites-les attendre un court temps de transition.Ensuite, envoyez-les dans le match en appelant la fonction prepareGame() dans MatchManager.Rappelez-vous, cette fonction n'imprime qu'une ligne, mais vous ajouterez plus de code plus tard.

  1. À la fin du cycle de répétition, ajoutez une déclaration d'impression indiquant que l'intermission est terminée pour tester votre code.Ensuite, suivez-le avec un task.wait() en utilisant la variable transitionTime de GameSetting.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Après l'attente, appelez le prepareGame() du module MatchManager.Lorsque le code s'exécute, cela imprimera simplement du texte dans la fenêtre de sortie.Attendez la section suivante pour tester ce code.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

Tester les jeux multijoueurs

En ce moment, pour que le code s'exécute prepareGame(), il doit quitter la boucle de répétition.Mais, pour le faire, il doit y avoir plus d'un joueur.Cela signifie que si vous utilisez le bouton de test de jeu, la fonction ne s'exécutera jamais car vous êtes le seul joueur dans le jeu (à moins que vos joueurs minimum ne soient un).Pour tester cela, vous devrez simuler un jeu multijoueur.

Démarrer un serveur local

Pour tester le code nécessitant plus d'un joueur, créez un serveur local.Bien que les jeux publiés soient normalement sur les serveurs de Roblox, un serveur local simule un jeu multijoueur sur votre ordinateur avec des joueurs simulés.

  1. Pour démarrer un serveur local, dans l'onglet Test > Clients et serveurs > définissez la liste déroulante du joueur au nombre de joueurs dans la variable minimumPlayers de GameSetting.Cette leçon utilise 2 joueurs.

  2. Cliquez sur Commencer pour démarrer le serveur.

  3. Attendez quelques secondes pour que le serveur soit configuré.Plusieurs fenêtres s'ouvriront en plus de la fenêtre Studio originale.Vous devrez peut-être autoriser l'accès à Roblox Studio à partir de pare-feux ou d'un autre logiciel de sécurité en ligne.

Conseils de dépannage

À ce stade, vous ne pouvez pas voir les serveurs de test, essayez l'une des options suivantes.

  • Si vous avez des problèmes avec le démarrage du serveur, vérifiez deux fois l'article Problèmes de pare-feu et de routeur.
  • Définissez le nombre de joueurs à un petit montant, comme 2 ou 3.
  • Si le problème persiste, essayez de redémarrer Studio ou de redémarrer votre ordinateur.

Test sur le serveur local

Vous verrez plusieurs fenêtres lorsque le serveur démarre. Chacune représente une partie différente de la relation serveur/client.

  • Serveur (frontière verte) exécute le jeu.
  • Client (bordures bleues) simule l'expérience d'un joueur.
Serveur avec bordure verte
Client avec bord bleu

Avec le serveur en place, vous pouvez vérifier si le code a fonctionné.

  1. Trouvez la fenêtre Serveur avec la bordure verte.Vérifiez la déclaration d'impression appelée depuis le script MatchManager.Parce qu'il y a une boucle de répétition, vous verrez les mêmes déclarations d'impression se répéter.

  2. Une fois que vous avez terminé les tests, dans n'importe quelle fenêtre, fermez le serveur par le bouton Nettoyer.Cela ferme toutes les fenêtres Serveur et Client et vous ramène à votre fenêtre Studio normale.

Conseils de dépannage

À ce stade, si les déclarations d'impression prévues n'apparaissent pas, essayez l'une des options suivantes.

  • Vérifiez que les fonctions comme prepareGame() sont dans le champ d'application de la boucle while true.
  • Si l'impression à partir de MatchManager ne fonctionnait pas, vérifiez quelques problèmes courants de résolution avec les scripts de module, comme vous vous assurer que le script de MatchManager est requis dans GameManager ou que prepareGame() est ajouté à la table de ce module.

Scripts terminés

Ci-dessous, les scripts terminés pour vérifier à nouveau votre travail.

scriptdu gestionnaire de jeu


-- Services
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Scripts de module
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Boucle de jeu principale
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

scriptde MatchManager


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

scriptdes paramètres de jeu


local GameSettings = {}
-- Variables de jeu
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings