Com o mapa criado, é hora de começar a construir os scripts. O resto deste curso focará fortemente na construção de todos os diferentes elementos do loop de jogo.
Configurando Scripts
O battle royale usará uma combinação de scripts de módulo e scripts normais. Abaixo estão os scripts e suas funções.
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 das Configurações do Jogo
Crie um script de módulo chamado GameSettings para armazenar variáveis usadas por outros scripts, como a duração da partida e a duração da intermissão. Essas variáveis serão usadas pelo script do Gerente de Jogo mais tarde.
Em Armazenamento do Servidor , crie um pasta chamado ModuleScripts. Neste pasta, crie um novo script de módulo chamado GameSettings.
Abra GameSettings e renomeie a tabela de módulo para corresponder ao nome do script.
local GameSettings = {}return GameSettingsNa tabela de módulos, adicione variáveis para os seguintes usos. Take your best guess for each value, you can always change it later as you test.
- Duração da Intermissão - Segundos os jogadores esperam antes de uma conferir.
- Duração da Partida - Comprimento de uma partida em segundos.
- Jogadores Mínimos - Número menor de jogadores necessários para iniciar.
- Tempo de Transição - Tempo antes e depois de uma partida em segundos. Torna a transição entre as partes do loop de jogo menos brusca.
local GameSettings = {}-- Variáveis do JogoGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
Script do MatchManager
O segundo script conectado ao GameManager é o MatchManager. Este script gerencia tarefas como iniciar o cronômetro ou redefinir os jogadores uma vez que o jogo termina.
Dentro do MatchManager está uma função chamada prepareGame() que inicia o jogo ao transformar os jogadores na conferir.
In ServerStorage > ModuleScripts > adicionar um script de módulo chamado MatchManager. Renomeie a tabela de módulo.
local MatchManager = {}return MatchManagerAdicione uma nova função de módulo chamada prepareGame() . Inclua uma declaração de impressão para testar o script mais tarde.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Código do Loop de Jogo
O principal script de loop de jogo será codificado no script GameManager usando as variáveis acabadas de criar. Lembre-se, há três fases no loop de jogo: intermissão, competição e limpeza e redefinir.
Script do GameManager
Este script é um script de servidor normal, então coloque-o no ServerScriptService, em vez do diretório de scripts de módulo. O loop de jogo real acontecerá em um tempo de verdade do ciclo.
In ServerScriptService, crie um novo script chamado GameManager.
Adicione uma variável para o serviço "ServerStorage", onde estão os Modulescripts. Em seguida, adicione uma variável para o serviço "Players", que será necessário para verificar o número de jogadores durante as intermissões.
-- Serviçoslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Para usar os módulos criados anteriormente:
- Defina uma variável chamada moduleScripts na localização da pasta ModuleScripts.
- Adicione variáveis chamadas matchManager e gameSettings . Defina cada variável para exigir seu script respectivo.
-- Serviçoslocal 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"))Depois das variáveis, adicione um while true do loop. Todas as fases do loop do jogo vão entrar para se repetir indefinidamente.
-- Scripts de Módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Loop principal do jogowhile true doend
Código da Intermissão
Enquanto o loop de jogo é executado indefinidamente, a intermissão deve pausar o loop e apenas continuar quando houver jogadores suficientes para uma conferir. Para codificar essa intermissão, inclua um loop de repetição aninhado para a intermissão na while loop. Esse loop de repetição aninhado será repetido até que haja jogadores suficientes, pausando o loop principal. Depois de códigar essa pausa, ele sairá e transformará os jogadores em uma conferir.
Com um repetir loop , o código no loop será executado pelo menos uma vez. Diferente de um while loop, ele não verifica sua condição até que o loop termine. Isso garante que os jogadores sempre vão para o lobby antes de uma conferir.
No while true do loop, type repeat e pressione Enter para autocompletar com a palavra-chave 1> until1>.
while true dorepeatuntilendVerifique se o número atual de jogadores (#Players:GetPlayers()) é maior ou igual à variável minimumPlayers criada anteriormente no módulo Configurações de Jogo.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendNa repetição, adicione uma declaração de impressão dizendo que a intermissão está começando. Use task.wait() para pausar para a intermissão usando intermissionDuration do GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendTeste e verifique se a declaração de impressão "Starting intermission" é exibida pelo menos duas vezes. Verificar se a mensagem é exibida duas vezes mostra que o loop de repetição não encontrou jogadores suficientes e foi executado novamente. Você terá que esperar o tempo de intermissão antes de ver a mensagem uma segunda vez.
Dicas de solução de problemas
Neste ponto, se você não estiver gerando como intencionado, tente um dos seguintes abaixo.
- task.wait() deve estar dentro do loop de repetição. Sem a espera, o script será executado muitas vezes em um segundo, sobrecarregando o Roblox Studio e causando um erro.
- No módulo Configurações de Jogo, a variável intermissionDuration deve ser maior que 1. Se menor, o script pode se repetir com muita frequência, causando problemas de desaceleração.
Terminando a Intermissão
Quando há jogadores suficientes, faça-os esperar um tempo de transição curto. Em seguida, envie-os para a partida chamando a função prepareGame() no Gerenciador de Partidas. Lembre-se, essa função apenas imprime uma linha, mas você adicionará mais código mais tarde.
No final do loop de repetição, adicione uma declaração de print dizendo que a intermissão acabou para testar seu código. Então, siga-o com uma variável de task.wait() usando a configuração de tempo de jogo.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endDepois da espera, chame o prepareGame() do módulo MatchManager. Quando o código for executado, isso só imprimirá texto na janela de saída. Espere até a próxima seção para testar 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
Testando Jogos Multijogador
Agora, para que o código seja executado prepareGame(), ele precisa sair do loop de repetição. Mas, para fazer isso, precisa haver mais de um jogador. Isso significa que, se você usar o botão de teste de jogo, a função nunca será executada porque você é o único jogador no jogo (a menos que seus mínimos sejam um). Para testar isso, você precisará simular um jogo multijogador.
Iniciando um Servidor Local
Para testar código que requer mais de um jogador, crie um servidor local. Embora os jogos publicados normalmente estejam em servidores do Roblox, um servidor local simula um jogo multijogador em seu computador com jogadores simulados.
Para iniciar um servidor local, na aba Teste > seção Clientes e Servidores > definir o menu suspenso do jogador para o número de jogadores na variável mínima de Jogos do GameSettings. Essa aula usa 2 jogadores.
Clique em Começar para iniciar o servidor.
Aguarde alguns segundos para o servidor configurar. Múltiplas janelas serão abertas ao lado de sua janela original do Studio. Você pode precisar permitir o acesso ao Roblox Studio a partir de firewalls ou outros softwares de segurança online.
Dicas de solução de problemas
Neste ponto, você não pode ver os servidores de teste, tente um dos seguintes abaixo.
- Se você tiver algum problema com o inicial do servidor, verifique duas vezes o artigo Problemas com Firewall e Router.
- Defina o número de jogadores para uma pequena quantidade, como 2 ou 3.
- Se o problema não for resolvido, tente reiniciar o Studio ou reiniciando seu computador.
Testando no Servidor Local
Você verá múltiplas janelas quando o servidor começar. Cada uma delas representa uma parte diferente do relacionamento do servidor/cliente.
- Servidor (fronteira verde) executa o jogo.
- Cliente (bordas azuis) simula a experiência de um jogador.
Com o servidor ligado, você pode verificar se o código funcionou.
Encontre a Server janela com a borda verde. Verifique se a declaração de impressão chamada pelo script MatchManager está em repetição. Como há um loop de repetição, você verá as mesmas declarações de impressão repetidas.
Uma vez que você terminar de testar, em qualquer janela, feche o servidor ao usar o botão Limpar. Isso fecha todas as janelas do Servidor e Cliente e leva você de volta para sua janela normal do Studio.
Dicas de solução de problemas
Neste ponto, se as declarações de impressão intencionais não aparecerem, tente uma das seguintes abaixo.
- Verifique se funções como prepareGame() estão em alcance da função de retorno de chamada.
- Se a impressão do MatchManager não funcionou, verifique alguns problemas comuns com scripts de módulo, como garantir que o script MatchManager seja necessário no GameManager ou que prepareGame() seja adicionado à tabela desse módulo.
Scripts Concluídos
Abaixo estão scripts concluídos para verificar duas vezes seu trabalho.
Script do GameManager
-- Serviçoslocal 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"))-- Loop principal do jogowhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Script do MatchManager
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
Script das Configurações do Jogo
local GameSettings = {}-- Variáveis do JogoGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings