Loops Practice - Criando uma ponte cronometrada

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

Este projeto é outro exemplo de usar loops de maneira prática. Para essa ponte, os jogadores tocarão em um botão para deixar a ponte passável por um tempo limitado antes que ela desapareça. Para criar um timer e mostrar o tempo restante para um jogador, você usará loops.

Configurando o projeto

Esta ponte pode ser incluída em qualquer projeto de jogo com desafios baseados em movimento, como um obby.

Criando Peças

  1. Encontre um lugar para construir uma ponte, como um rio ou um grande espaço em um obby. Crie três ancoradas partes como abaixo.

    • Exibição do Temporizador
    • Ponte
    • Ponte de Botões
  2. Quando inativo, a ponte será semi-transparente. Para fazer isso, selecione a Ponte e altere suas propriedades.

    • Transparência = 0.8
    • CanCollide = Falso

Criando o Display de Temporizador

Ao atravessar a ponte, os jogadores precisarão ver quantos segundos faltam antes que a ponte desapareça. Uma maneira de exibir imagens ou texto é adicionando um objeto chamado Surface GUI a uma peça. Os GUI de superfície também podem ser usados para criar sinais no jogo, barras de saúde personalizadas e sistemas de inventário. Este tutorial passará por isso rapidamente, mas mais informações podem ser encontradas na seção Tutoriais.

  1. Selecione TimerDisplay e adicione um SurfaceGui . Então, relacionado ao Surface Gui, adicione um TextLabel .

  2. Selecione a Interface gráfica do usuárioda Superfície. Nas Propriedades, faça as seguintes alterações:

    • Altere o Face para que você possa ver o rótulo de texto na frente do temporizador onde o jogador está olhando.
  3. Selecione o Label de Texto. Nas Propriedades, faça as seguintes alterações:

    • Defina Tamanho para {1, 0},{1, 0} .
    • Defina TextScaled para true.
    • Defina Texto para em branco. O texto será atualizado usando o script.

Configurando o Script

Agora que o temporizador está no local, crie um script para controlar a ponte e mostrar o número da contagem regressiva aos jogadores.

  1. Na parte Bridge, adicione um novo script chamado TimedBridge. Nesse script, crie as seguintes variáveis.


    local bridge = script.Parent
    local button = workspace.ButtonBridge
    local timerText = workspace.TimerDisplay.SurfaceGui.TextLabel
    -- Por quanto tempo a ponte permanecerá sólida
    local timerDuration = 5

Codificando a Interação de Toque

Para usar a ponte, você precisará criar duas funções. Uma função tornará a ponte andável e exibirá o temporizador. A outra função ouvirá se um jogador tocar no botão que ativa a ponte.

  1. Crie uma nova função chamada startTimer() com uma declaração de impressão dentro. Você usará a declaração de impressão para testar seu código.


    local timerDuration = 5
    local function startTimer()
    print("Countdown started")
    end
  2. Crie uma função chamada buttonPressed() para verificar se um humanoide toca no botão. A função deve aceitar um parâmetro de partTouched e, em seguida, ter uma instrução if vazia se um humanoide for detectado nessa parte.


    local function startTimer()
    print("Countdown started")
    end
    local function buttonPressed(partTouched)
    local character = partTouched.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    end
    end
  3. Para iniciar o temporizador, na instrução if, chame a função startTimer().


    local function buttonPressed(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    startTimer()
    end
    end
  4. No final de buttonPressed(), conecte a função buttonPressed() ao evento Touched do botão.


    local function buttonPressed(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    startTimer()
    end
    end
    button.Touched:Connect(buttonPressed)
  5. Corra o projeto. Toque na peça e verifique na janela de saída para ver a declaração de impressão.

Dicas de solução de problemas

Neste ponto, se a ponte não funcionar conforme o planejado, tente uma das seguintes opções abaixo. Problema : Mensagem de erro dizendo: "... is not a valid member of workspace" .

  • No script TimedBridge, verifique se todas as peças estão escritas exatamente como são vistas no Explorador. Problema : Não consigo ver as peças.

  • Certifique-se de que as três partes estejam ancoradas.

  • Verifique a propriedade Transparência para a ponte.

Criando o Temporizador

Sempre que os jogadores pisarem na ponte, startTimer() tornará a ponte andável e iniciará o cronômetro. Quando o cronômetro atingir 0, a ponte se tornará intransponível, fazendo com que qualquer um que não for rápido o suficiente queda.

Tornando a Ponte Caminhável

Para começar, o script precisará tornar a ponte sólida ou colidível e, em seguida, iniciar um temporizador até que ela se torne intransponível.

  1. Para tornar a ponte andável, em startTimer(), altere a propriedade Transparência da ponte para 0 (opaque) e a propriedade CanCollide para true.


    local function startTimer()
    -- Tornar a ponte visível e caminhável
    bridge.Transparency = 0
    bridge.CanCollide = true
    end
  2. Para criar um temporizador que conta para baixo, crie um loop com os seguintes valores.

    • Variável de controle : nomeada count , definida como timerDuration .
    • Fim : 0
    • Incremento : -1

    local function startTimer()
    -- Tornar a ponte visível e caminhável
    bridge.Transparency = 0
    bridge.CanCollide = true
    for count = timerDuration, 0, -1 do
    end
    end
  3. Para mostrar o temporizador aos jogadores, altere o texto para timerText para exibir a contagem digitando timerText.Text = count. Cada vez que o loop for passar por uma iteração, ele mostrará aos jogadores o próximo número no temporizador.


    for count = timerDuration, 0, -1 do
    timerText.Text = count
    end
  4. Use uma função task.wait para fazer com que o loop for corra apenas uma vez por segundo.


    for count = timerDuration, 0, -1 do
    timerText.Text = count
    task.wait(1)
    end
  5. Corra o jogo. Quando você tocar no botão, a ponte deve aparecer e o cronômetro iniciar, depois será concluído.

Impedindo a Ponte de Reiniciar

Observe, no entanto, se você se mover no botão, o cronômetro continuará reiniciando.

Isso ocorre porque o loop for está sendo chamado toda vez que você toca no botão e inicia o loop for desde o início. Para evitar que o temporizador reinicie constantemente, você precisará adicionar um booleano, um tipo de variável, que controlará se startTimer() pode ser chamado novamente. Booleanos são escritos da mesma maneira que outras variáveis, mas em vez de usar números ou cadeias de caracteres, eles só podem ser configurados como verdadeiro ou falso. Nesta situação, o script usará um booleano para verificar se o temporizador está rodando no momento antes de iniciá-lo.

  1. Na parte superior do seu script, sob suas variáveis, crie uma variável chamada timerActive e configure-a como false já que ninguém pressionou o botão ainda.


    local timerDuration = 5
    local timerActive = false
    local function startTimer()
  2. Para ter certeza de que o temporizador só começará quando o timerActive booleano for falso, adicione uma segunda condição à instrução if em buttonPressed().


    local function buttonPressed(otherPart)
    local character = otherPart.Parent
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid and timerActive == false then
    startTimer()
    end
    end
  3. Para evitar que startTimer() corra novamente antes que o timer acabe, defina o booleano timerActive como verdadeiro.


    local function startTimer()
    timerActive = true
    bridge.Transparency = 0
    bridge.CanCollide = true
  4. Na função startTimer(), após o loop for, defina a ponte de volta às suas propriedades originais alterando a transparência da ponte para 0,8 e CanCollide para false.


    local function startTimer()
    timerActive = true
    bridge.Transparency = 0
    bridge.CanCollide = true
    -- Para loop que conta para baixo a partir do timerDuration
    for count = timerDuration, 0, -1 do
    timerText.Text = count
    task.wait(1)
    end
    -- Tornar a ponte intransitável
    bridge.Transparency = 0.8
    bridge.CanCollide = false
    end
  5. Uma última coisa para redefinir a ponte é mudar o timerText para uma string vazia como era originalmente. Então, defina o timerActive booleano como falso.


    bridge.Transparency = 0.8
    bridge.CanCollide = false
    timerText.Text = ""
    timerActive = false
  6. Teste e verifique se a ponte pode ser usada várias vezes.

Completar roteiro de ponte cronometrada


local bridge = script.Parent
-- Obtém o botão conforme digitado no Explorador
local button = workspace.ButtonBridge
-- Obtém a peça para exibição
local timerPart = workspace.TimerDisplay
-- Obtém o Texto que exibirá o temporizador
local timerText = timerPart.SurfaceGui.TextLabel
-- Quanto tempo os jogadores têm para atravessar a ponte
local timerDuration = 5
local timerActive = false
local function startTimer()
print("Countdown started")
timerActive = true
bridge.Transparency = 0
bridge.CanCollide = true
-- Para loop que conta para baixo a partir do timerDuration
for count = timerDuration, 0, -1 do
timerText.Text = count
task.wait(1)
end
-- Tornar a ponte intransitável
bridge.Transparency = 0.8
bridge.CanCollide = false
timerText.Text = ""
timerActive = false
end
local function buttonPressed(partTouched)
local character = partTouched.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
print("part touched")
if humanoid and timerActive == false then
print("starting timer")
startTimer()
end
end
button.Touched:Connect(buttonPressed)

Resumo

Loops podem ser combinados com diferentes meios de interação para criar momentos divertidos de jogo. Neste Tutorial, uma ponte cronometrada é criada usando um loop que funciona como uma contagem regressiva. Durante a contagem regressiva, os jogadores recebem um tempo limitado para atravessar.