Jogadores agora podem coletar moedas e perdê-las quando morrem, mas as moedas não fazem nada, e a maior parte do mundo do jogo é inacessível sem a capacidade de pular muito alto.Esta seção do tutorial ensina você a concluir a lógica para sua experiência adicionando um botão na tela que gasta moedas para aumentar o poder de pulo.
Crie o botão de atualização
As interfaces 2D no Roblox são tipicamente compostas por uma coleção de componentes de GUI dentro de um contêiner de GUI.Neste caso, você só precisa de um componente TextButton que diga Pulo de Atualização (5 Moedas) dentro de um ScreenGui recipiente.
Para criar a Interface gráfica do usuário:
- Na janela Explorer , adicione um novo diretório em ReplicatedStorage , então renomeie o diretório para Instâncias .Qualquer objeto em ReplicatedStorage é acessível ao cliente do Roblox de cada jogador, onde as interfaces gráficas são exibidas.
- Adicione um objeto ScreenGui na pasta Instâncias .
- Selecione o Objeto ScreenGui , então na janela Propriedades ,
- Defina Nome para JumpPurchaseGui .
- Desabilite ResetOnSpawn para garantir que a GUI permaneça ligada ao jogador quando eles respawnarem.
- Na janela Explorer , insira um TextButton no contêiner JumpPurchaseGui , então renomeie o botão de texto para JumpButton .
- (Opcional) Personalize a aparência e a posição do botão configurando suas propriedades. Sugestões simples incluem:
- Defina a propriedade Texto para Aprimorar Pulo (5 Moedas) .
- Defina a propriedade Tamanho do Texto para 25.
- Defina Ponto de Ancoragem para 1, 1 e Posição para {1, 0},{1, 0} para mover o botão para o canto inferior direito.
Você adicionará o botão à GUI do jogador mais tarde neste Tutorial, mas antes de fazer isso, você precisa definir toda a lógica e dados que são necessários para o botão funcionar.
Definir dados de poder de pulo
Atualmente, apenas o número de moedas é armazenado para cada jogador no script do módulo Dados do Jogador .Você também precisa armazenar e atualizar a potência de pulo da mesma maneira.Porque as funções em PlayerData não são específicas para os dados que estão sendo alterados, tudo o que é necessário para armazenar o poder de pulo do jogador é adicionar uma chave Jump e inicializar seu valor inicial em DEFAULT_PLAYER_DATA .
Para atualizar o script do módulo Dados do Jogador para armazenar poder de pulo:
Na janela Explorer , abra o script do módulo Dados do Jogador na Armazenamento do Servidor .
Substitua o código no script com o seguinte exemplo, que inicializa um valor Jump para cada jogador ao lado de seu valor existente Coins:
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"PlayerData.JUMP_KEY_NAME = "Jump"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number,["Jump"] = jumpPower: number}--]]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0,[PlayerData.JUMP_KEY_NAME] = 0,}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerData
Atualizar dados de poder de pulo
Agora que Dados do Jogador são capazes de rastrear a potência de pulo, você precisa implementar lógica no servidor para aumentar a potência de pulo de um solicitar / pedirdo cliente de um jogador.
O servidor e o cliente podem se comunicar através de eventos remotos ou funções remotas.Eventos remotos não são gerados quando são disparados e são apropriados para comunicação de um para um.Funções remotas retornam até que recebam uma resposta, o que permite uma comunicação de duas vias.Neste caso, o cliente precisa saber se o servidor melhorou com sucesso a potência de pulo do jogador, então uma função remota é ideal.
Para implementar a upgrade / melhoriade pulo:
Na janela Explorer , abra o diretório Instâncias na Armazenamento Replicado .
Insira um RemoteFunction na pasta Instâncias , então renomeie a função remota para IncreaseJumpPowerFunction .Você sempre cria funções remotas em ReplicatedStorage porque tanto o cliente quanto o servidor devem ser capazes de acessá-las.
Na janela Explorer , selecione Jogador Inicial .
Na janela Propriedades , habilite a propriedade CharacterUseJumpPower .Por padrão, o valor do poder de pulo de um personagem não define a quantidade que um personagem salta, então isso precisa ser ativado.
Na janela Explorer , insira um novo script em Serviço de Script de Servidor , então renomeie o script para JumpService .Este script conterá a lógica para melhorias de pulo.
Substitua o código padrão pelo seguinte código:
-- Serviçoslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Móveislocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Eventoslocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAMElocal COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal JUMP_POWER_INCREMENT = 30local JUMP_COIN_COST = 5local function updateJumpPower(player, updateFunction)-- Atualize a tabela de poder de pulolocal newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- Atualize a força de pulo dos jogadoreslocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- Atualizar a tabela de classificação de puloLeaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)endendlocal function onPurchaseJumpIncrease(player)local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)if coinAmount < JUMP_COIN_COST thenreturn falseend-- Aumentar a força de pulo do jogadorupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- Atualize a tabela de moedaslocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- Atualize a tabela de classificação de moedasLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- Redefina a força de pulo do jogador quando o personagem for adicionadoupdateJumpPower(player, function(_)return 0end)end-- Inicialize qualquer jogador adicionado antes de se conectar ao evento PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- Inicialização normal de jogadores do evento PlayerAddedlocal function onPlayerAdded(player)player.CharacterAdded:Connect(function()onCharacterAdded(player)end)endlocal function onPlayerRemoved(player)updateJumpPower(player, function(_)return nilend)endIncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncreasePlayers.PlayerAdded:Connect(onPlayerAdded)Players.PlayerRemoving:Connect(onPlayerRemoved)Explicação de códigoAs seções a seguir descrevem o código com mais detalhe.
Atualize os dados de poder de pulo - updateJumpPower() atualiza o poder de pulo do jogador e da tabela de classificação para fornecer comentário/retornovisual.Essa função se assemelha ao código que causa danos aos jogadores em Criar perigos de jogador.Forneceu um modelo Character e Humanoid existente para o jogador sendo atualizado, a função atualiza a propriedade JumpPower para o novo valor armazenado por PlayerData , aumentando-a em 30.Se você quiser que seu jogo dure um pouco mais, você pode diminuir esse número.
Valide solicitações de servidor - onPurchaseJumpIncrease() primeiramente verifica se o jogador realmente tem o número de moedas necessário para comprar a upgrade / melhoria. Todos os pedidos de clientes para o servidor devem ser validados para impedir que os atores maliciosos enviem pedidos falsos e explorem sua experiência.
Adicione o botão à Interface gráfica do usuáriodo jogador
Um objeto ScreenGui apenas aparece na tela se for parentado a um ObjetoPlayerGui do jogador.Por padrão, isso contém a GUI do sistema, como a janela de chat.Agora você precisa criar um script em ReplicatedStorage para copiar o botão de atualização na GUI de cada jogador e implementar o comportamento quando pressionado.
Para adicionar o botão à GUI do jogador quando eles se juntarem:
Na janela Explorer , crie um Script em ReplicatedStorage .
Selecione o script, então na janela Propriedades ,
- Defina Nome para JumpButtonClickHandler .
- Defina Contexto de Execução para Cliente . Isso diz ao motor para sempre executar este script no cliente para otimizar a comunicação de rede.
No script aberto, substitua o código padrão pelo seguinte código:
local ReplicatedStorage = game:GetService("ReplicatedStorage")local Players = game:GetService("Players")local player = Players.LocalPlayerlocal playerGui = player.PlayerGuilocal IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunctionlocal jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGuilocal jumpButton = jumpPurchaseGui.JumpButtonlocal function onButtonClicked()local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)if not success then-- comprado será a mensagem de erro se o sucesso for falsoerror(purchased)elseif success and not purchased thenwarn("Not enough coins!")endendjumpButton.Activated:Connect(onButtonClicked)-- Adicione o JumpPurchaseGui à Gui do jogadorjumpPurchaseGui.Parent = playerGuiExplicação de códigoAs seções a seguir descrevem o código com mais detalhe.
- Obtenha referências à função GUI e ao servidor - As variáveis IncreaseJumpPowerFunction, jumpPurchaseGui e jumpButton contêm referências à função e ao GUI que chamam a função que você precisará mais tarde.
- Defina o manipulador de eventos - onButtonClicked() define a lógica para quando os usuários clicam no botão de atualização.Ele usa pcall() (chamada protegida) para invocar o RemoteFunction .Qualquer comunicação cliente-servidor como esta requer pcall() para lidar com erros ou problemas de conexão.
- Conecte o manipulador ao botão - O evento Activated é compatível em todas as plataformas, incluindo mouse, toque ou contexto de gamepad.Ele é acionado quando um clique , toque ou botão do gamepad é liberado.
Teste de Jogo
Você deve agora ser capaz de comprar upgrades de pulo para moedas usando o botão de upgrade. Para testar o projeto:
Na barra de ferramentas, clique no botão Jogar . O Studio entra no modo de teste de jogo.
Se seus scripts estiverem funcionando corretamente, um botão para comprar poder de pulo aparece na tela.Tente clicar no botão antes de coletar quaisquer moedas para verificar que ele não lhe concede poder de pulo adicional, então tente coletar algumas moedas e verifique se a atualização funciona quando você clica novamente.
Agora que o código está completo, tente equilibrar o jogo através da quantidade e das posições das moedas.Adicione mais moedas se o jogo parecer muito lento, ou subtraia moedas e coloque-as em lugares desafiadores se parecer muito rápido e fácil.