Este projeto é mais um exemplo de como usar loops for de uma maneira prática. Para esta ponte, os jogadores tocarão um botão para tornar a ponte transitável por um tempo limitado antes que ela desapareça. Para criar um cronômetro e mostrar o tempo restante para um jogador, você usará loops for.
Configurar o projeto
Esta ponte pode ser incluída em qualquer projeto de jogo com desafios baseados em movimento, como um obby.
Criar partes
Encontre um lugar para construir uma ponte, como um rio ou um grande espaço em um obby. Crie três partes ancoradas como abaixo.
- TimerDisplay
- Bridge
- ButtonBridge
Quando inativa, a ponte será semi-transparente. Para fazer isso, selecione a Bridge e altere suas propriedades.
- Transparency = 0.8
- CanCollide = False
Criar a exibição do cronômetro
Ao atravessar a ponte, os jogadores precisarão ver quantos segundos restam antes que a ponte desapareça. Uma maneira de exibir imagens ou texto é adicionando um objeto chamado Surface GUI a uma parte. Surface GUIs também podem ser usadas para criar placas dentro do jogo, barras de saúde personalizadas e sistemas de inventário. Este tutorial abordará isso rapidamente, mas mais informações podem ser encontradas na seção Tutoriais.
Selecione TimerDisplay e adicione um SurfaceGui. Em seguida, adicione um TextLabel como filho do Surface Gui.
Selecione o Surface GUI. Nas Propriedades, faça as seguintes alterações:
- Altere o Face para que você possa ver o rótulo de texto na frente do cronômetro, onde o jogador está olhando.
Selecione o TextLabel. Nas Propriedades, faça as seguintes alterações:
- Defina Size para {1, 0},{1, 0}.
- Defina TextScaled como verdadeiro.
- Deixe Text em branco. O texto será atualizado usando o script.
Configurar o script
Agora que o cronômetro está no lugar, crie um script para controlar a ponte e exibir o número de contagem regressiva para os jogadores.
Na parte Bridge, adicione um novo script chamado TimedBridge. Nesse script, crie as seguintes variáveis.
local bridge = script.Parentlocal button = workspace.ButtonBridgelocal timerText = workspace.TimerDisplay.SurfaceGui.TextLabel-- Quanto tempo a ponte ficará sólidalocal timerDuration = 5
Codificar a interação de toque
Para usar a ponte, você precisará criar duas funções. Uma função tornará a ponte transitável e exibirá o cronômetro. A outra função ouvirá se um jogador toca o botão que ativa a ponte.
Crie uma nova função chamada startTimer() com uma declaração de print dentro. Você usará a declaração de print para testar seu código.
local timerDuration = 5local function startTimer()print("Contagem regressiva iniciada")endCodifique uma função chamada buttonPressed() para verificar se um humanoide toca o botão. A função deve aceitar um parâmetro de partTouched, e então ter uma declaração if vazia se um humanoide for detectado nessa parte.
local function startTimer()print("Contagem regressiva iniciada")endlocal function buttonPressed(partTouched)local character = partTouched.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenendendPara iniciar o cronômetro, na declaração if, chame a função startTimer().
local function buttonPressed(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenstartTimer()endendSob o final de buttonPressed(), conecte a função buttonPressed() ao evento Touched do botão.
local function buttonPressed(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenstartTimer()endendbutton.Touched:Connect(buttonPressed)Execute o projeto. Toque na parte e verifique na janela Output para ver a declaração print.
Dicas de solução de problemas
Neste ponto, se a ponte não funcionar como pretendido, tente uma das seguintes opções abaixo.
Problema: Mensagem de erro dizendo: "... não é um membro válido do workspace".
- No script TimedBridge, verifique se todas as partes estão escritas exatamente como aparecem no Explorer.
Problema: Não consigo ver as partes.
- Certifique-se de que todas as três partes estão ancoradas.
- Verifique a propriedade de Transparência da ponte.
Criar o cronômetro
Sempre que os jogadores pisarem na ponte, startTimer() tornará a ponte transitável e iniciará o cronômetro. Assim que o cronômetro chegar a 0, a ponte se tornará não transitável, fazendo com que qualquer um que não seja rápido o suficiente caia.
Tornar a ponte transitável
Para começar, o script precisará tornar a ponte sólida, ou colidível, e então iniciar um cronômetro até que ela se torne não transitável.
Para tornar a ponte transitável, em startTimer(), altere a propriedade de Transparência da ponte para 0 (opaca) e a propriedade CanCollide para true.
local function startTimer()-- Tornar a ponte visível e transitávelbridge.Transparency = 0bridge.CanCollide = trueendPara criar um cronômetro que conte regressivamente, crie um loop for com os seguintes valores.
- Variável de Controle: chamada count, definida como timerDuration.
- Fim: 0
- Incremento: -1
local function startTimer()-- Tornar a ponte visível e transitávelbridge.Transparency = 0bridge.CanCollide = truefor count = timerDuration, 0, -1 doendendPara mostrar o cronômetro aos jogadores, altere o texto em timerText para exibir o count digitando timerText.Text = count. Cada vez que o loop for passa por uma iteração, ele mostrará aos jogadores o próximo número no cronômetro.
for count = timerDuration, 0, -1 dotimerText.Text = countendUse uma função task.wait para fazer o loop for rodar apenas uma vez por segundo.
for count = timerDuration, 0, -1 dotimerText.Text = counttask.wait(1)endExecute o jogo. Quando você tocar no botão, a ponte deverá aparecer e o cronômetro começará, e então será completado.
Impedir que a ponte reinicie
Observe, porém, que se você se mover no botão, o cronômetro continuará reiniciando.
Isso ocorre porque o loop for está sendo chamado cada vez que você toca o botão e iniciando o loop for do início. Para impedir que o cronômetro 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 forma que outras variáveis, mas em vez de usar números ou strings, eles podem ser definidos apenas como verdadeiro ou falso. Nesta situação, o script usará um booleano para verificar se o cronômetro está atualmente em execução antes de iniciá-lo.
No topo do seu script, sob suas variáveis, crie uma variável chamada timerActive e defina como false, pois ninguém pressionou o botão ainda.
local timerDuration = 5local timerActive = falselocal function startTimer()Para garantir que o cronômetro só comece quando o booleano timerActive for falso, adicione uma segunda condição à declaração if em buttonPressed().
local function buttonPressed(otherPart)local character = otherPart.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and timerActive == false thenstartTimer()endendPara impedir que startTimer() seja executado novamente antes que o cronômetro acabe, defina o booleano timerActive como verdadeiro.
local function startTimer()timerActive = truebridge.Transparency = 0bridge.CanCollide = trueNa função startTimer(), depois do loop for, redefina a ponte para suas propriedades originais, alterando a transparência da ponte para 0.8 e CanCollide para false.
local function startTimer()timerActive = truebridge.Transparency = 0bridge.CanCollide = true-- Loop for que conta regressivamente de timerDurationfor count = timerDuration, 0, -1 dotimerText.Text = counttask.wait(1)end-- Tornar a ponte não transitávelbridge.Transparency = 0.8bridge.CanCollide = falseendUma última coisa para redefinir a ponte é alterar o timerText para uma string vazia, como estava originalmente. Em seguida, defina o booleano timerActive como falso.
bridge.Transparency = 0.8bridge.CanCollide = falsetimerText.Text = ""timerActive = falseFaça um teste de jogo e verifique se a ponte pode ser usada várias vezes.
Script completo da ponte temporizada
local bridge = script.Parent
-- Obtém o botão como está digitado no Explorer
local button = workspace.ButtonBridge
-- Obtém a parte para a exibição
local timerPart = workspace.TimerDisplay
-- Obtém o texto que exibirá o cronômetro
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("Contagem regressiva iniciada")
timerActive = true
bridge.Transparency = 0
bridge.CanCollide = true
-- Loop for que conta regressivamente de timerDuration
for count = timerDuration, 0, -1 do
timerText.Text = count
task.wait(1)
end
-- Tornar a ponte não transitá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("parte tocada")
if humanoid and timerActive == false then
print("iniciando o cronômetro")
startTimer()
end
end
button.Touched:Connect(buttonPressed)
Resumo
Loops podem ser combinados com diferentes formas de interação para criar momentos de jogabilidade divertidos. Neste tutorial, uma ponte temporizada é criada usando um loop for que funciona como uma contagem regressiva. Durante a contagem regressiva, os jogadores têm um tempo limitado para atravessar.