Codifica el ciclo del juego

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Con el mapa creado, es hora de comenzar a construir los scripts.El resto de este curso se centrará en gran medida en la programación de todos los elementos diferentes del bucle del juego.

Configurar los scripts

La batalla real usará una combinación de scripts de módulo y scripts normales. A continuación se muestran los scripts y sus funciones.

Gestor de juegosScript. Ejecuta funciones desde el administrador de partidos usando variables de la configuración del juego
Gestor de partidosScript de módulo. Ejecuta funciones como enviar jugadores a una arena o rastrear el tiempo en una coincidir.
Configuración del juegoScript de módulo. Almacena variables comúnmente utilizadas utilizadas por otros scripts.

scriptde configuración del juego

Crea un guión de módulo llamado GameSettings para almacenar variables utilizadas por otros scripts, como la duración de la partida y la interrupción.Estas variables se usarán por el script GameManager más tarde.

  1. En Almacenamiento del servidor , crea una carpeta llamada ModuleScripts. En esa carpeta, crea un nuevo script de módulo llamado GameSettings.

  2. Abre GameSettings y renombra la tabla de módulos para que coincida con el nombre del script.


    local GameSettings = {}
    return GameSettings
  3. En la tabla de módulos, agregue variables para los siguientes usos. Toma tu mejor conjetura para cada valor, siempre puedes cambiarlo más tarde mientras pruebas.

    • Duración de la intermisión - Segundos que esperan los jugadores antes de un coincidir.
    • Duración del partido - Longitud de un partido en segundos.
    • Mínimo de jugadores - Menor número de jugadores necesarios para iniciar.
    • Tiempo de transición - Tiempo antes y después de una partida en segundos. Hace que la transición entre partes del ciclo del juego sea menos repentina.

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

Guión scriptMatchManager

El segundo script conectado al GameManager es el MatchManager.Este script gestiona tareas como iniciar el temporizador o reiniciar a los jugadores una vez que termina el partido.

Dentro de MatchManager hay una función llamada prepareGame() que inicia el juego al hacer la transición de los jugadores al coincidir.

  1. En ServerStorage > ModuleScripts > añade un guión de módulo llamado MatchManager. Renombra la tabla de módulos.


    local MatchManager = {}
    return MatchManager
  2. Añade una nueva función de módulo al MatchManager llamada prepareGame(). Incluye una declaración de impresión para probar el script más tarde.


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

Codifica el ciclo del juego

El ciclo de juego principal se codificará en el script de GameManager usando las variables acabadas de crear.Recuerde, hay tres fases en el ciclo de juego: intermisión, competición y limpieza y restablecer.

scriptdel administrador del juego

Este script es un script de servidor normal, así que ponlo en ServerScriptService, en lugar del directorio de scripts de módulo.El ciclo de juego real estará en un ciclo while true.

  1. En ServerScriptService, crea un nuevo script llamado GameManager.

  2. Añade una variable para el servicio "Almacenamiento del servidor", que es donde están los Modulescripts.A continuación, añade una variable para el servicio "Jugadores", que será necesaria para verificar el número de jugadores durante las interrupciones.


    -- Servicios
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Para usar los módulos creados anteriormente:

    • Establece una variable llamada moduleScripts en la ubicación de la carpeta de ModuleScripts.
    • Añade variables llamadas matchManager y gameSettings. Establece cada variable para que requiera su respectivo script.

    -- Servicios
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Scripts de módulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. Después de las variables, agregue un bucle while true do . Todas las fases del bucle del juego irán dentro para repetirse indefinidamente.


    -- Scripts de módulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Bucle de juego principal
    while true do
    end

Codifica la interrupción

Mientras que el ciclo de juego se ejecuta indefinidamente, el intermedio debe pausar el ciclo y solo continuar cuando haya suficientes jugadores para una coincidir.Para codificar esta pausa, incluye un bucle de repetición anidado para la interrupción en el bucle while.Ese bucle anidado se repetirá hasta que haya suficientes jugadores, pausando el bucle principal.Una vez que haya suficientes jugadores, saldrá y transitará a los jugadores a una coincidir.

Con un bucle de repetición , el código en el bucle se ejecutará al menos una vez.A diferencia de un bucle while, no comprueba su condición hasta que termine el bucle.Esto garantiza que los jugadores siempre vayan al vestíbulo antes de una coincidir.

  1. En el bucle while true do, escriba repeat y presione Enter para completar automáticamente con la palabra clave until.


    while true do
    repeat
    until
    end
  2. Compruebe si el número actual de jugadores (#Players:GetPlayers()) es mayor o igual al variable minimumPlayers creada anteriormente en el módulo GameSettings.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. En el bucle de repetición, agrega una declaración de impresión que dice que la interrupción está comenzando.Usa task.wait() para pausar por el intermedio usando intermissionDuration de GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Prueba y comprueba que la declaración de impresión "Starting intermission" se muestra al menos dos veces.Ver el mensaje dos veces prueba que el bucle repetitivo no encontró suficientes jugadores y se ejecutó de nuevo.Tendrás que esperar la duración del intermedio antes de ver el mensaje una segunda vez.

Consejos de solución de problemas

En este punto, si no estás apareciendo como se pretendía, prueba uno de los siguientes a continuación.

  • task.wait() debe estar dentro del bucle de repetición.Sin espera, el script se ejecutará demasiadas veces en un segundo, sobrecargando Roblox Studio y causando un error.
  • En el módulo de configuración del juego, la variable intermissionDuration debe ser mayor que 1. Si es inferior, el script se puede repetir demasiado a menudo, causando problemas de ralentización.

Termina el intermedio

Una vez que haya suficientes jugadores, hazlos esperar un corto período de transición.Luego, envíelos al partido llamando a la función prepareGame() en MatchManager.Recuerde, que esa función solo imprime una línea, pero agregará más código más tarde.

  1. Al final del ciclo de repetición, agrega una declaración de impresión que dice que la interrupción ha terminado para probar tu código.Luego, síguelo con una task.wait() usando 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. Después de la espera, llama al prepareGame() del módulo MatchManager.Cuando se ejecuta el código, esto solo imprimirá texto en la ventana de salida.Espere hasta la siguiente sección para probar este código.


    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

Prueba juegos multijugador

En este momento, para que el código se ejecute prepareGame(), debe salir del bucle de repetición.Pero, para hacer eso, necesita haber más de un jugador.Esto significa que si usas el botón de prueba de juego, la función nunca se ejecutará porque eres el único jugador en el juego (a menos que tus jugadores mínimos sean uno).Para probar esto, necesitarás simular un juego multijugador.

Inicie un servidor local

Para probar el código que requiere más de un jugador, crea un servidor local.Si bien los juegos publicados normalmente están en los servidores de Roblox, un servidor local simula un juego multijugador en tu computadora con jugadores simulados.

  1. Para iniciar un servidor local, en la pestaña Prueba > Clientes y servidores > establezca la lista desplegable del reproductor al número de jugadores en la variable mínima de jugadores de GameSetting.Esta lección usa a 2 jugadores.

  2. Haga clic en Iniciar para comenzar el servidor.

  3. Espere unos segundos para que el servidor se inicie.Se abrirán múltiples ventanas además de la ventana original de Studio.Es posible que deba permitir el acceso a Roblox Studio desde los cortafuegos u otro software de seguridad en línea.

Consejos de solución de problemas

En este punto, no puedes ver los servidores de prueba, prueba uno de los siguientes a continuación.

  • Si tiene algún problema con el inicio del servidor, verifique dos veces el artículo Problemas de firewall y router.
  • Establece el número de jugadores a una pequeña cantidad, como 2 o 3.
  • Si el problema no se resuelve, intenta reiniciar Studio o reiniciar tu computadora.

Prueba en el servidor local

Verás múltiples ventanas cuando el servidor comience. Cada una representa una parte diferente de la relación servidor/cliente.

  • Servidor (borde verde) ejecuta el juego.
  • Cliente (borde azul) simula la experiencia de un jugador.
Servidor con borde verde
Cliente con borde azul

Con el servidor en marcha, puedes comprobar si el código funcionó.

  1. Busque la ventana Servidor con el borde verde.Compruebe la declaración de impresión llamada desde el script de MatchManager.Debido a que hay un bucle de repetición, verás las mismas declaraciones de impresión repitiéndose.

  2. Una vez que hayas terminado de probar, en cualquier ventana, cierra el servidor con el botón de Limpieza.Esto cierra todas las ventanas del servidor y del cliente y te devuelve a tu ventana normal de Studio.

Consejos de solución de problemas

En este punto, si las declaraciones de impresión previstas no aparecieron, prueba una de las siguientes opciones.

  • Asegúrate de que las funciones como prepareGame() estén en el alcance del bucle while verdadero.
  • Si la impresión desde MatchManager no funcionó, verifique algunos problemas comunes de solución con scripts de módulo, como asegurarse de que el script de MatchManager sea requerido en GameManager o que prepareGame() se agregue a la tabla de ese módulo.

Guiones completados

A continuación, se completan los scripts para verificar doblemente tu trabajo.

scriptdel administrador del juego


-- Servicios
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Scripts de módulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Bucle de juego principal
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

Guión scriptMatchManager


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

scriptde configuración del juego


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