Codifique o ciclo do 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 se concentrará fortemente em escrever todos os diferentes elementos do ciclo do jogo.

Configurar os scripts

A batalha royale usará uma combinação de scripts de módulo e scripts normais. A seguir estão os scripts e suas funções.

Gerenciador de JogoScript. Executa funções do Gerenciador de Partidas usando variáveis das Configurações do Jogo
Gerenciador de PartidaScript de módulo. Executa funções como enviar jogadores para uma arena ou acompanhar o tempo em uma conferir.
Configurações do JogoScript de módulo. Armazena variáveis comumente usadas usadas por outros scripts.

scriptde Configurações do Jogo

Crie um script de módulo chamado GameSettings para armazenar variáveis usadas por outros scripts, como duração de partida e intermissão.Essas variáveis serão usadas pelo script GameManager mais tarde.

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

  2. Abra as Configurações do Jogo e renomeie a tabela de módulos para corresponder ao nome do script.


    local GameSettings = {}
    return GameSettings
  3. Na tabela de módulos, adicione variáveis para os seguintes usos. Use sua melhor estimativa para cada valor, você sempre pode alterá-lo mais tarde durante o teste.

    • 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 - Menor número de jogadores necessários para iniciar.
    • Tempo de transição - Tempo antes e depois de uma partida em segundos. Torna a transição entre partes do ciclo de jogo menos repentina.

    local GameSettings = {}
    -- Variáveis do jogo
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

scriptdo Gerenciador de Partida

O segundo script conectado ao GameManager é o MatchManager.Este script gerencia tarefas como iniciar o cronômetro ou reiniciar os jogadores após o fim da partida.

Dentro do MatchManager existe uma função chamada prepareGame() que inicia o jogo ao fazer a transição de jogadores para a conferir.

  1. No Armazenamento de Servidor > ModuleScripts > adicione 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 ao MatchManager 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

Codifique o ciclo do jogo

O ciclo de jogo principal será codificado no script do Gerenciador de Jogo usando as variáveis acabadas de criar.Lembre-se, há três fases no ciclo do jogo: intermissão, competição e limpeza e redefinir.

scriptdo Gerenciador de Jogo

Este script é um script de servidor normal, então coloque-o no ServerScriptService, em vez do diretório de scripts de módulo.O ciclo de jogo real estará em um ciclo while verdadeiro.

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

  2. Adicione uma variável para o serviço "Armazenamento do Servidor", que é onde os Modulescripts estão.Então adicione uma variável para o serviço "Jogadores", que será necessária 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 de ModuleScripts.
    • Adicione variáveis chamadas matchManager e gameSettings. Defina cada variável para exigir seu respectivo script.

    -- 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 ciclo. Todas as fases do ciclo do jogo irão para dentro 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"))
    -- Ciclo de jogo principal
    while true do
    end

Codifique a intermissão

Enquanto o ciclo do jogo é executado indefinidamente, a intermissão deve pausar o ciclo e só continuar quando houver suficientes jogadores para uma conferir.Para codificar essa pausa, inclua um ciclo de repetição aninhado para a intermissão no loop while.Esse ciclo aninhado se repetirá até que haja jogadores suficientes, pausando o ciclo principal.Uma vez que haja jogadores suficientes, sairá e transicionará os jogadores para uma conferir.

Com um 循环重复 , o código no loop será executado pelo menos uma vez.Ao contrário de um loop while, ele não verifica sua condição até o fim do loop.Isso garante que os jogadores sempre vão ao lobby antes de uma conferir.

  1. No loop while true do, digite repeat e pressione Enter para preencher automaticamente com a palavra-chave until.


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


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. No ciclo de 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 de 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" é mostrada pelo menos duas vezes.Ver a mensagem duas vezes prova que o ciclo de repetição não encontrou jogadores suficientes e rodou 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 sendo gerado como pretendido, 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 do Jogo, a variável intermissionDuration deve ser maior que 1. Se for menor, o script pode se repetir com muita frequência, causando problemas de desaceleração.

Acabe com a intermissão

Uma vez que há jogadores suficientes, faça-os esperar um curto período de transição.Então, envie-os para a partida chamando a função prepareGame() na Gerenciador de Partida.Lembre-se, essa função apenas imprime uma linha, mas você adicionará mais código mais tarde.

  1. No final do ciclo de repetição, adicione uma declaração de impressão dizendo que a interrupção acabou para testar seu código.Então, siga-o com um task.wait() usando a variável transitionTime do 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. Após a espera, chame o prepareGame() do módulo MatchManager.Quando o código é executado, isso imprimirá apenas texto na janela de Saída.Espere até a próxima seção para testar esse 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

Teste jogos multijogador

No momento, para que o código seja executado prepareGame(), precisa sair do ciclo 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 seu número mínimo de jogadores seja um).Para testar isso, você precisará simular um jogo multijogador.

Inicie um servidor local

Para testar código que requer mais de um jogador, crie um servidor local.Enquanto jogos publicados normalmente estão em servidores do Roblox, um servidor local simula um jogo multijogador no seu computador com jogadores simulados.

  1. Para iniciar um servidor local, na aba Teste > Clientes e Servidores > defina o menu suspenso do jogador para o número de jogadores na variável mínimaPlayers do GameSetting.Esta lição usa 2 jogadores.

  2. Clique em Iniciar para iniciar o servidor.

  3. Espere alguns segundos para o servidor configurar.Várias janelas serão abertas além da janela original do Studio.Talvez você precise permitir o acesso ao Roblox Studio a partir de firewalls ou outro software de segurança online.

Dicas de solução de problemas

Neste ponto, você não é capaz de ver os servidores de teste, tente um dos seguintes abaixo.

  • Se você tiver quaisquer problemas com o servidor iniciando, 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 reiniciar seu computador.

Teste no servidor local

Você verá várias janelas quando o servidor iniciar. Cada uma representa uma parte diferente da relação servidor/cliente.

  • Servidor (borde verde) executa o jogo.
  • Cliente (limites azuis) simula a experiência de um jogador.
Servidor com borda verde

Cliente com borda azul
>

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

  1. Encontre a janela Servidor com o limite verde.Verifique a declaração de impressão chamada pelo script MatchManager.Como há um ciclo de repetição, você verá as mesmas declarações de impressão se repetindo.

  2. Uma vez que você terminar de testar, em qualquer janela, feche o servidor pelo botão Limpar.Isso fecha todas as janelas do Servidor e do Cliente e leva você de volta para a janela normal do Studio.

Dicas de solução de problemas

Neste ponto, se as declarações de impressão pretendidas não aparecerem, tente uma das seguintes abaixo.

  • Verifique se funções como prepareGame() estão em escopo do loop while verdadeiro.
  • Se a impressão a partir do MatchManager não funcionou, verifique alguns problemas comuns de solução com scripts de módulo, como garantir que o script do MatchManager seja necessário no GameManager ou que prepareGame() seja adicionado à tabela do módulo.

Scripts concluídos

Abaixo estão scripts concluídos para verificar duas vezes o seu trabalho.

scriptdo Gerenciador de Jogo


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

scriptdo Gerenciador de Partida


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

scriptde Configurações do Jogo


local GameSettings = {}
-- Variáveis do jogo
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings