Código do Loop de Jogo

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

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 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 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.

  1. Em Armazenamento do Servidor , crie um pasta chamado ModuleScripts. Neste pasta, crie um novo script de módulo chamado GameSettings.

  2. Abra GameSettings e renomeie a tabela de módulo para corresponder ao nome do script.


    local GameSettings = {}
    return GameSettings
  3. Na 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 Jogo
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return 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.

  1. In ServerStorage > ModuleScripts > adicionar um script de módulo chamado MatchManager. Renomeie a tabela de módulo.


    local MatchManager = {}
    return MatchManager
  2. Adicione 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!")
    end
    return 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.

  1. In ServerScriptService, crie um novo script chamado GameManager.

  2. 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ços
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. 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ços
    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. 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ódulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Loop principal do jogo
    while true do
    end

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.

  1. No while true do loop, type repeat e pressione Enter para autocompletar com a palavra-chave 1> until1>.


    while true do
    repeat
    until
    end
  2. Verifique 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 do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. Na 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 do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Teste 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.

  1. 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 do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Depois 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 do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("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.

  1. 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.

  2. Clique em Começar para iniciar o servidor.

  3. 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.
Servidor com borda verde
Cliente com borda azul

Com o servidor ligado, você pode verificar se o código funcionou.

  1. 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.

  2. 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ços
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"))
-- Loop principal do jogo
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

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 Jogo
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings