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 juego | Script. Runea funciones del administrador de partidos usando variables de la configuración del juego |
MatchManager | Script del módulo. Runs funciones como enviar jugadores a una arena o mantener el tiempo en una coincidir. |
Configuración del juego | Script 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.
En Almacenamiento del Servidor , crea una carpeta llamada ModuleScripts. En esa carpeta, crea un nuevo módulo de script llamado GameSettings.
Abre GameSettings y renombra la tabla del módulo para que coincida con el nombre del script.
local GameSettings = {}return GameSettingsEn 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 juegoGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return 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.
En ServerStorage > ModuleScripts > agrega un módulo de script llamado MatchManager. Renombrar la tabla del módulo.
local MatchManager = {}return MatchManagerAñ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!")endreturn 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.
En ServerScriptService, crea un nuevo script llamado GameManager.
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.
-- Servicioslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")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.
-- Servicioslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))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ódulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Ciclo de juego principalwhile true doend
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.
En el ciclo while true do , escriba repeat y presione Enter para autocompletar con la palabra clave 1> until1> .
while true dorepeatuntilendCompruebe 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 dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendEn 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 dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendPruebe 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.
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 dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endDespué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 dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("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.
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.
Haga clic en Iniciar para comenzar el servidor.
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.
Con el servidor encendido, puede verificar si el código funcionó.
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.
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
-- Servicioslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Ciclo de juego principalwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("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 juegoGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings