Avec la carte créée, il est temps de commencer à construire les scripts. Le reste de ce cours se concentrera sur la construction de tous les différents éléments du game loop.
Configurer les scripts
Le battle royale utilisera une combinaison de scripts de module et de scripts normaux. Voici les scripts et leurs fonctions.
Gestionnaire de jeu | Script. Exécute des fonctions à partir du Gestionnaire de correspondance en utilisant des variables des paramètres du jeu |
MatchManager | Script de module. Exécute des fonctions telles que l'envoi de joueurs dans une arène ou le suivi du temps dans un correspondre. |
GameSettings | ModuleScript. Stocke les variables couramment utilisées par d'autres scripts. |
Script GameSettings
Créez un script de module nommé GameSettings pour stocker les variables utilisées par d'autres scripts, comme la durée de match et de l'intermission. Ces variables seront utilisées par le script GameManager plus tard.
Dans ServerStorage , créez un dossier nommé ModuleScripts. Dans ce dossier, créez un nouveau script de module nommé GameSettings.
Ouvrez GameSettings et renommez la table du module pour correspondre au nom du script.
local GameSettings = {}return GameSettingsDans la table de module, ajoutez des variables pour les utilisations suivantes. Prenez votre meilleure devinette pour chaque valeur, vous pouvez toujours le modifier plus tard pendant que vous testez.
- Durée de l'intermission - Secondes les joueurs attendent avant un correspondre.
- Durée du match - Longueur d'un match en secondes.
- Joueurs minimums - Plus petit nombre de joueurs nécessaires pour commencer.
- Temps de transition - Temps avant et après un match en secondes. Rend la transition entre les parties du game loop moins soudaine.
local GameSettings = {}-- Variables de jeuGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
Script de MatchManager
Le deuxième script connecté au GameManager est le MatchManager. Ce script gère des tâches comme le démarrage du minuteur ou le réinitialisation des joueurs une fois que le match est terminé.
Dans MatchManager, il y a une fonction nommée prepareGame() qui lance le jeu en transférant les joueurs dans le correspondre.
Dans ServerStorage > ModuleScripts > ajouter un script de module nommé MatchManager. Renommez la table de module.
local MatchManager = {}return MatchManagerAjoutez une nouvelle fonction de module nommée prepareGame() . Incluez une déclaration d'impression pour tester le script plus tard.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Programmer la boucle de jeu
La boucle de jeu principale sera codée dans le script GameManager en utilisant les variables vient de créer. N'oubliez pas, il y a trois phases dans la boucle de jeu : l'intermission, la compétition et le nettoyage et le réinitialiser.
Script de GameManager
Ce script est un script de serveur normal, alors mettez-le dans ServerScriptService, plutôt que le dossier des scripts de module. Le véritable game loop sera dans un moment vrai do loop.
Dans ServerScriptService, créez un nouveau script nommé GameManager.
Ajoutez une variable pour le service "ServerStorage", qui est l'endroit où se trouvent les ModulesScripts. Ensuite, ajoutez une variable pour le service "Joueurs", qui sera nécessaire pour vérifier le nombre de joueurs pendant les intermissions.
-- Serviceslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Pour utiliser les modules créés précédemment :
- Définissez une variable nommée moduleScripts dans le dossier des ModuleScripts.
- Ajoutez des variables nommées matchManager et gameSettings . Définissez chaque variable pour exiger leur script respectif.
-- Serviceslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))Après les variables, ajoutez un while true do boucle. Toutes les phases du boucle de jeu vont entrer pour se répéter infiniment.
-- Scripts de modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Boucle de jeu principalwhile true doend
Codage de l'intermission
Alors que la boucle de jeu s'exécute infiniment, l'intermission doit suspendre la boucle et ne continuer que lorsque il y a assez de joueurs pour un correspondre. Pour codifier cette pause, incluez un boucle répétitif imbriqué pour l'intermission dans la boucle principale. Ce boucle imbriqué répétera jusqu'à ce qu'il y ait assez de joueurs, ce qui fera sortir et transférer les joueurs dans un correspondre.
Avec un répéter le boucle , le code dans le boucle s'exécute au moins une fois. Contrairement à un boucle de temps, il ne vérifie pas sa condition jusqu'à la fin du boucle. Cela garantit que les joueurs vont toujours au lobby avant un correspondre.
Dans le while true do boucle, typez repeat et appuyez sur Entrer pour autocompléter avec le mot-clé 1> until1>.
while true dorepeatuntilendVérifiez si le nombre actuel de joueurs (#Players:GetPlayers()) est supérieur ou égal à la variable minimumPlayers créée dans le module GameSettings.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendDans la boucle de répétition, ajoutez une déclaration d'impression indiquant que l'intermission commence. Utilisez task.wait() pour暂停 pour l'intermission en utilisant intermissionDuration de GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendTestez le jeu 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 le boucle de répétition n'a pas trouvé assez de joueurs et s'est exécuté à nouveau. Vous devrez attendre la durée de l'intermission avant de voir le message une deuxième fois.
Conseils de débogage
À ce stade, si vous n'apparaissez pas comme prévu, essayez l'une des solutions suivantes.
- task.wait() devrait être dans le boucle de répétition. Sans le wait, le script s'exécutera trop de fois en un seul, surchargant Roblox Studio et causant une erreur.
- Dans le module de paramètres du jeu, la variable intermissionDuration doit être plus grande que 1. Si elle est inférieure, le script peut se répéter trop souvent, ce qui cause des problèmes de ralentissement.
Fin de l'intermission
Une fois qu'il y a assez de joueurs, faites-leur attendre un court temps de transition. Ensuite, envoyez-les dans le match en appelant la fonction prepareGame() dans MatchManager. N'oubliez pas que cette fonction ne fait que d'imprimer une ligne, mais vous ajouterez plus de code plus tard.
Au bout du répéter le boucle, ajoutez une déclaration d'impression disant que l'intermission est terminée pour tester votre code. Ensuite, suivez-le avec un task.wait() à l'aide de la variable GameSettings's transitionTime.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endAprès la réception, appelez le prepareGame() à partir du module MatchManager. Lorsque le code s'exécute, ceci ne fera que imprimer du texte dans la fenêtre d'affichage de sortie. Attendez la prochaine section pour tester ce code.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("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 le 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 playtest, la fonction ne s'exécutera jamais parce que vous êtes le seul joueur dans le jeu (sauf si vos joueurs minimum sont 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 Roblox, un serveur local simule un jeu multijoueur sur votre ordinateur avec des joueurs simulés.
Pour démarrer un serveur local, dans l'onglet Test > Clients et serveurs > section Dropdown du joueur au nombre de joueurs dans GameSettings's variable minimumPlayers. Cette leçon utilise 2 joueurs.
Cliquez sur Démarrer pour commencer le serveur.
Attendez quelques secondes pour que le serveur se mette en place. Plusieurs fenêtres s'ouvriront en plus de votre fenêtre Studio originale. Vous devrez peut-être permettre l'accès à Roblox Studio depuis les pare-feux ou d'autres logiciels de sécurité en ligne.
Conseils de débogage
À ce stade, vous ne pouvez pas voir les serveurs de test, essayez l'un des suivants ci-dessous.
- Si vous avez des problèmes avec le démarrage du serveur, vérifiez à nouveau l'article Problèmes de pare-feu et de routeur.
- Définissez le nombre de joueurs à un montant inférieur, comme 2 ou 3.
- Si le problème ne se résoud pas, essayez de redémarrer Studio ou de redémarrer votre ordinateur.
Tester dans le serveur local
Vous verrez plusieurs fenêtres lorsque le serveur s'exécute. Chacune représente une partie différente de la relation serveur/client.
- Serveur (bordure verte) exécute le jeu.
- Client (bordures bleues) simule l'expérience d'un joueur.
Avec le serveur en place, vous pouvez vérifier si le code a fonctionné.
Trouvez la fenêtre Server avec la bordure verte. Vérifiez la déclaration d'impression appelée à partir du script MatchManager. Parce qu'il y a un boucle de répétition, vous verrez les mêmes déclarations d'impression se répétant.
Une fois que vous avez terminé le test, dans n'importe quelle fenêtre, fermez le serveur en appuyant sur le bouton Nettoyer. Cela ferme toutes les fenêtres du serveur et vous ramène à votre fenêtre Studio normale.
Conseils de débogage
À ce stade, si les déclarations d'impression prévues n'ont pas été affichées, essayez l'une des suivantes.
- Vérifiez que les fonctions comme prepareGame() sont dans le champ d'application du while true do loop.
- Si la sortie de MatchManager n'a pas fonctionné, vérifiez quelques problèmes de débogage avec les scripts de module, comme vous assurer que le script de MatchManager est requis dans GameManager ou que prepareGame() est ajouté à la table de ce module.
Scripts terminés
Ceux-ci sont des scripts terminés pour vérifier vos travaux.
Script de GameManager
-- Serviceslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Boucle de jeu principalwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Script de MatchManager
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
Script GameSettings
local GameSettings = {}-- Variables de jeuGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings