Codificando el Game Loop

*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 enfocará en gran medida en la programación de todos los diferentes elementos de la interfaz de usuario.

Configurando los scripts

El modo batalla royale usará una combinación de scripts de módulo y scripts normales. Abajo están los scripts y sus funciones.

Administrador del juegoScript. Runea funciones del administrador de partidos usando variables de la configuración del juego
MatchManagerScript del módulo. Runs funciones como enviar jugadores a una arena o mantener el tiempo en una coincidir.
Configuración del juegoScript del módulo. Almacena las variables comúnmente utilizadas por otros scripts.

Script de GameSettings

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

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

  2. Abre GameSettings y renombra la tabla del módulo 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. Tome su mejor conjetura para cada valor, siempre puede cambiarlo más tarde durante la prueba.

    • Duración de la intermedio - Segundos los jugadores esperan antes de un coincidir.
    • Duración de la partida - Duración de la partida en segundos.
    • Jugadores mínimos - Número más pequeño de jugadores necesarios para iniciar.
    • Tiempo de transición - Tiempo antes y después de un partido en segundos. Hace que la transición entre partes del ciclo de juego sea menos brusca.

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

Guión de MatchManager

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

Dentro de MatchManager está una función llamada 準備比賽() que comienza el juego haciendo que los jugadores se transfieran al coincidir.

  1. En ServerStorage > ModuleScripts > agrega un módulo de script llamado MatchManager. Renombrar la tabla del módulo.


    local MatchManager = {}
    return MatchManager
  2. Añade una nueva función de módulo a 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

Codificando el Game Loop

La principal ronda de juego se codificará en el script GameManager utilizando las variables que se acaban de crear. Recuerda, hay tres fases en la ronda de juego: intermedio, competición y restablecery restablecimiento.

Script de GameManager

Este script es un script de servidor normal, así que póngalo en ServerScriptService, en lugar de la carpeta de script de módulo. El bucle de juego real tendrá lugar en un tiempo real, no en un tiempo de ciclo de módulo.

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

  2. Agregue una variable para el servicio "ServerStorage", que es donde se encuentran los Modulescripts. Luego agregue una variable para el servicio "Jugadores", que se necesitará para verificar el número de jugadores durante los intermedios.


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

    • Establece una variable llamada moduleScripts en la ubicación de la carpeta de módulos.
    • Añade variables llamadas matchManager y gameSettings . Establece cada variable para requerir 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 se repetirán indefinidamente.


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

Código de la intermedio

Mientras que la intermedio se ejecuta indefinidamente, la intermedio debería pausar la intermedio y solo continuar cuando haya suficientes jugadores para un coincidir. Para codificar esta intermedio, incluir un bucle repetitivo para la intermedio en el bucle principal. Ese bucle repetitivo se repetirá hasta que haya suficientes jugadores, pausando el bucle principal. Una vez que haya suficientes jugadores, saldrá y cambiará jugadores en una coincidir.

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

  1. En el ciclo while true do , escriba repeat y presione Enter para autocompletar con la palabra clave 1> until1> .


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


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


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Pruebe y verifique que la declaración de impresión "Starting intermission" se muestre al menos dos veces. Ver el mensaje dos veces demuestra que el bucle de repetición no encontró suficientes jugadores y se ejecutó de nuevo. Tendrás que esperar la duración de la interrupción antes de ver el mensaje de nuevo.

Consejos de solución de problemas

En este punto, si no estás apareciendo como se esperaba, intenta uno de los siguientes.

  • task.wait() debería estar dentro de la repetición de la ronda. Sin la espera, el script 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 debería ser mayor que 1. Si se reduce, el script se puede repetir demasiado a menudo, lo que causa problemas de rendimiento.

Finalizando el Intermedio

Una vez que haya suficientes jugadores, haz que esperen un tiempo de transición corto. Luego, envíalos al juego llamando la función prepareGame() en el administrador de partes. Recuerda, esa función solo imprime una línea, pero agregarás más código más tarde.

  1. Al final de la repetición del bucle, agregue una declaración de impresión diciendo que la interrupción ha terminado para probar su código. Luego, siga con un task.wait() usando la variable de tiempo de transición de GameSettings.


    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, llame al prepareGame() desde el módulo de MatchManager. Cuando se ejecute el código, esto solo imprimirá texto en la ventana de salida. Espere hasta la próxima 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

Probar juegos multijugador

En este momento, para que el código se ejecute prepareGame() , necesita salir del bucle de repetición. Pero, para hacer eso, necesita que haya más de un jugador. Esto significa que si usa 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 mínimos jugadores sean uno). Para probar esto, necesitarás simular un juego multijugador.

Iniciando un Servidor Local

Para probar el código que requiere más de un jugador, crea un servidor local. Mientras que los juegos publicados generalmente están en servidores de Roblox, un servidor local simula un juego multijugador en su ordenador con jugadores simulados.

  1. Para iniciar un servidor local, en la pestaña Prueba > Clientes y servidores > configura el menú desplegable del jugador a la cantidad de jugadores en GameSettings's variable minimumPlayers. Esta lección usa 2 jugadores.

  2. Haga clic en Iniciar para comenzar el servidor.

  3. Espere unos segundos para que el servidor se configure. Se abrirán varias ventanas además de su ventana original de Studio. Es posible que deba permitir el acceso a Roblox Studio desde firewalls o otro software de seguridad en línea.

Consejos de solución de problemas

En este momento, no puede ver los servidores de prueba, intente uno de los siguientes.

  • Si tiene algún problema con el inicio del servidor, revise dos veces el artículo Problemas de firewall y ruta.
  • Establece el número de jugadores a una pequeña cantidad, como 2 o 3.
  • Si el problema no se soluciona, intente reiniciar Studio o reiniciar su equipo.

Testeo en el servidor local

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

  • Servidor (frontera verde) ejecuta el juego.
  • Cliente (fronteras azules) simula la experiencia de un jugador.
Servidor con borda verde
Cliente con borda azul

Con el servidor encendido, puede verificar si el código funcionó.

  1. Encuentra la ventana Servidor con el borde verde. Comprueba la declaración de impresión llamada desde el script MatchManager. Debido a que hay una declaración de impresión repetida, verás las mismas declaraciones de impresión repitiendo.

  2. Una vez que hayas terminado de probar, en cualquier ventana, cierra el servidor haciendo clic en el botón Limpiar. Esto cierra todas las ventanas del servidor y del cliente y te llevará de vuelta a tu ventana de Studio normal.

Consejos de solución de problemas

En este punto, si las declaraciones de impresión intencionales no aparecieron, intenta uno de los siguientes.

  • Asegúrese de que las funciones como prepareGame() estén en el alcance de while true do loop.
  • Si la impresión de MatchManager no funcionó, verifique algunos problemas comunes con los scripts de módulo, como asegurarse de que el script de MatchManager esté requerido en GameManager o que prepareGame() esté agregado a la tabla de ese módulo.

Scripts Completados

A continuación, están los scripts completados para revisar tu trabajo.

Script de GameManager


-- 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"))
-- Ciclo 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 de MatchManager


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

Script de GameSettings


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