Los jugadores ahora pueden recolectar monedas y perderlas cuando mueran, pero las monedas no hacen nada, y la mayor parte del mundo del juego es inaccesible sin la capacidad de saltar muy alto.Esta sección del tutorial te enseña cómo terminar la lógica para tu experiencia agregando un botón en la pantalla que gasta monedas para aumentar el poder de salto.
Crear el botón de actualización
Las interfaces 2D en Roblox se componen típicamente de una colección de componentes de interfaz de usuario dentro de un contenedor de interfaz de usuario.En este caso, solo necesitas un componente TextButton que diga Mejora de salto (5 monedas) dentro de un contenedor ScreenGui.
Para crear la interfaz Interfaz gráfica (o GUI):
- En la ventana Explorador , agregue un nuevo directorio en Almacenamiento replicado , luego renombre el directorio a Instancias .Cualquier objeto en ReplicatedStorage es accesible al cliente de Roblox de cada jugador, donde se muestran las interfaces gráficas.
- Añade un objeto ScreenGui en la carpeta Instancias .
- Seleccione el objeto ScreenGui , luego en la ventana Propiedades ,
- Establece Nombre a JumpPurchaseGui .
- Desactivar ResetOnSpawn para asegurar que la interfaz de usuario se mantenga como padre del jugador cuando reaparezcan.
- En la ventana Explorador , inserte un TextButton en el contenedor JumpPurchaseGui , luego renombre el botón de texto a JumpButton .
- (Opcional) Personalice la apariencia y la posición del botón configurando sus propiedades. Las sugerencias simples incluyen:
- Establece la propiedad Texto a Mejora de salto (5 monedas) .
- Establece la propiedad TextSize a 25.
- Establece Punto de anclaje a 1, 1 y Posición a {1, 0},{1, 0} para mover el botón a la esquina inferior derecha.
Añadirás el botón a la interfaz del jugador más tarde en este tutorial, pero antes de hacerlo, debes definir toda la lógica y los datos que se requieren para que el botón funcione.
Define los datos de potencia de salto
Actualmente, solo se almacena el recuento de monedas para cada jugador en el script del módulo PlayerData .También necesitas almacenar y actualizar la potencia de salto de la misma manera.Debido a que las funciones en PlayerData no son específicas para los datos que se están cambiando, todo lo que se requiere para almacenar la potencia de salto del jugador es agregar una clave Jump y para inicializar su valor inicial en DEFAULT_PLAYER_DATA.
Para actualizar el script del módulo PlayerData para almacenar potencia de salto:
En la ventana Explorador , abra el script del módulo Datos del jugador en Almacenamiento del servidor .
Reemplace el código en el script con el siguiente ejemplo, que inicializa un valor Jump para cada jugador junto con su 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
Actualizar los datos de potencia de salto
Ahora que PlayerData es capaz de rastrear la potencia de salto, necesitas implementar lógica en el servidor para actualizar la potencia de salto desde una solicitud del cliente de un jugador.
El servidor y el cliente pueden comunicarse a través de eventos remotos o funciones remotas.Los eventos remotos no se generan cuando se disparan y son apropiados para la comunicación de un solo sentido.Las funciones remotas se ejecutan hasta que reciban una respuesta, lo que permite la comunicación de ida y vuelta.En este caso, el cliente necesita saber si el servidor actualizó exitosamente la potencia de salto del jugador, por lo que una función remota es ideal.
Para implementar la mejorade salto:
En la ventana Explorador , abra la carpeta Instancias en ReplicatedStorage .
Inserte una función remota en la carpeta Instancias , luego renombre la función remota a Incrementar función de potencia de salto .Siempre creas funciones remotas en ReplicatedStorage porque tanto el cliente como el servidor deben poder acceder a ellas.
En la ventana Explorador , seleccione StarterPlayer .
En la ventana Propiedades , habilita la propiedad CharacterUseJumpPower .Por defecto, el valor de potencia de salto de un personaje no define la cantidad que un personaje salta, por lo que esto debe estar habilitado.
En la ventana Explorador , inserte un nuevo script en ServerScriptService , luego renombre el script a JumpService .Este script contendrá la lógica para las mejoras de salto.
Reemplazar el código predeterminado con el siguiente código:
-- Servicioslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Móduloslocal 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)-- Actualizar la tabla de potencia de saltolocal newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)-- Actualizar la potencia de salto de los jugadoreslocal character = player.Character or player.CharacterAdded:Wait()local humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid thenhumanoid.JumpPower = newJumpPower-- Actualizar la tabla de clasificación de saltosLeaderboard.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 la potencia de salto del jugadorupdateJumpPower(player, function(oldJumpPower)oldJumpPower = oldJumpPower or 0return oldJumpPower + JUMP_POWER_INCREMENTend)-- Actualizar la tabla de monedaslocal newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)return oldCoinAmount - JUMP_COIN_COSTend)-- Actualizar la tabla de clasificación de monedasLeaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)return trueendlocal function onCharacterAdded(player)-- Restablecer la potencia de salto del jugador cuando se agrega el personajeupdateJumpPower(player, function(_)return 0end)end-- Inicializa cualquier jugador agregado antes de conectarse al evento PlayerAddedfor _, player in Players:GetPlayers() doonCharacterAdded(player)end-- Normalización de la inicialización de jugadores desde el 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)Explicación de códigoLas siguientes secciones describen el código con más detalle.
Actualizar los datos de potencia de salto - updateJumpPower() actualiza la potencia de salto del jugador y la tabla de clasificación para proporcionar opiniónvisuales.Esta función se parece al código que daña a los jugadores en Crear peligros para jugadores .Proporcionó un modelo Character y Humanoid existente para el jugador que se está actualizando, la función actualiza la propiedad JumpPower al nuevo valor almacenado por PlayerData , aumentándolo en 30.Si quieres que tu juego dure un poco más, puedes reducir este número.
Validar solicitudes de servidor - onPurchaseJumpIncrease() primero comprueba que el jugador realmente tiene el número de monedas requerido para comprar la mejora. Todas las solicitudes de los clientes al servidor deben ser válidas para evitar que los actores malos envíen solicitudes falsas y exploten su experiencia.
Añade el botón a la interfaz Interfaz gráfica (o GUI)del jugador
Un objeto ScreenGui solo se muestra en la pantalla si está asociado a un objeto PlayerGui del jugador.Por defecto, esto contiene la interfaz gráfica del sistema, como la ventana de chat.Ahora necesitas crear un script en ReplicatedStorage para copiar el botón de actualización en la interfaz gráfica de cada jugador y implementar el comportamiento para cuando se presione.
Para agregar el botón a la interfaz del jugador cuando se unan:
En la ventana Explorador , crea un Script en ReplicatedStorage .
Seleccione el script, luego en la ventana Propiedades ,
- Establece Nombre a JumpButtonClickHandler .
- Establecer Contexto de ejecución a Cliente . Esto le dice al motor que siempre ejecute este script en el cliente para optimizar la comunicación de red.
En el script abierto, reemplaza el código predeterminado con el siguiente 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á el mensaje de error si el éxito es falsoerror(purchased)elseif success and not purchased thenwarn("Not enough coins!")endendjumpButton.Activated:Connect(onButtonClicked)-- Añade el JumpPurchaseGui al Gui del jugadorjumpPurchaseGui.Parent = playerGuiExplicación de códigoLas siguientes secciones describen el código con más detalle.
- Obtener referencias a la función GUI y del servidor - Las variables IncreaseJumpPowerFunction , jumpPurchaseGui y jumpButton contienen referencias a la función y a la GUI que llamará la función que necesitarás más tarde.
- Defina el manipulador de eventos - onButtonClicked() define lógica para cuando los usuarios hagan clic en el botón de actualización.Utiliza pcall() (llamada protegida) para invocar el RemoteFunction .Cualquier comunicación cliente-servidor como esta requiere pcall() para manejar errores o problemas de conexión.
- Conecta el manejador al botón - El evento Activated es compatible en todas las plataformas, incluidos el contexto del ratón, la pantalla táctil o el gamepad.Se activa cuando se hace clic en un clic , toque o botón del gamepad se lanza.
Prueba de juego
Ahora deberías poder comprar mejoras de salto para monedas usando el botón de actualización. Para probar el proyecto:
En la barra de herramientas, haz clic en el botón Jugar . Studio entra en modo de prueba de juego.
Si tus scripts funcionan correctamente, aparece un botón para comprar potencia de salto en la pantalla.Intenta hacer clic en el botón antes de recoger ninguna moneda para comprobar que no te otorga poder de salto adicional, luego intenta recoger algunas monedas y ver si la actualización funciona cuando hagas clic de nuevo.
Ahora que el código está completo, intenta equilibrar el juego a través de la cantidad y las posiciones de las monedas.Añade más monedas si el juego se siente demasiado lento, o resta monedas y ponlas en lugares desafiantes si se siente demasiado rápido y fácil.