Script un botón de actualización

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.


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):

  1. 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.
  2. Añade un objeto ScreenGui en la carpeta Instancias .
  3. Seleccione el objeto ScreenGui , luego en la ventana Propiedades ,
    1. Establece Nombre a JumpPurchaseGui .
    2. Desactivar ResetOnSpawn para asegurar que la interfaz de usuario se mantenga como padre del jugador cuando reaparezcan.
  4. En la ventana Explorador , inserte un TextButton en el contenedor JumpPurchaseGui , luego renombre el botón de texto a JumpButton .
  5. (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:

  1. En la ventana Explorador , abra el script del módulo Datos del jugador en Almacenamiento del servidor .

  2. 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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end
    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end
    return 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:

  1. En la ventana Explorador , abra la carpeta Instancias en ReplicatedStorage .

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

    Studio's Explorer window with the IncreaseJumpPowerFunction script highlighted under the Instances folder.
  3. En la ventana Explorador , seleccione StarterPlayer .

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

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

  6. Reemplazar el código predeterminado con el siguiente código:


    -- Servicios
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Módulos
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Eventos
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAME
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local JUMP_POWER_INCREMENT = 30
    local JUMP_COIN_COST = 5
    local function updateJumpPower(player, updateFunction)
    -- Actualizar la tabla de potencia de salto
    local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
    -- Actualizar la potencia de salto de los jugadores
    local character = player.Character or player.CharacterAdded:Wait()
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.JumpPower = newJumpPower
    -- Actualizar la tabla de clasificación de saltos
    Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)
    end
    end
    local function onPurchaseJumpIncrease(player)
    local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)
    if coinAmount < JUMP_COIN_COST then
    return false
    end
    -- Aumentar la potencia de salto del jugador
    updateJumpPower(player, function(oldJumpPower)
    oldJumpPower = oldJumpPower or 0
    return oldJumpPower + JUMP_POWER_INCREMENT
    end)
    -- Actualizar la tabla de monedas
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
    return oldCoinAmount - JUMP_COIN_COST
    end)
    -- Actualizar la tabla de clasificación de monedas
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    return true
    end
    local function onCharacterAdded(player)
    -- Restablecer la potencia de salto del jugador cuando se agrega el personaje
    updateJumpPower(player, function(_)
    return 0
    end)
    end
    -- Inicializa cualquier jugador agregado antes de conectarse al evento PlayerAdded
    for _, player in Players:GetPlayers() do
    onCharacterAdded(player)
    end
    -- Normalización de la inicialización de jugadores desde el evento PlayerAdded
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(function()
    onCharacterAdded(player)
    end)
    end
    local function onPlayerRemoved(player)
    updateJumpPower(player, function(_)
    return nil
    end)
    end
    IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncrease
    Players.PlayerAdded:Connect(onPlayerAdded)
    Players.PlayerRemoving:Connect(onPlayerRemoved)

    Las 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:

  1. En la ventana Explorador , crea un Script en ReplicatedStorage .

  2. Seleccione el script, luego en la ventana Propiedades ,

    1. Establece Nombre a JumpButtonClickHandler .
    2. 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.
  3. 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.LocalPlayer
    local playerGui = player.PlayerGui
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGui
    local jumpButton = jumpPurchaseGui.JumpButton
    local function onButtonClicked()
    local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)
    if not success then
    -- comprado será el mensaje de error si el éxito es falso
    error(purchased)
    elseif success and not purchased then
    warn("Not enough coins!")
    end
    end
    jumpButton.Activated:Connect(onButtonClicked)
    -- Añade el JumpPurchaseGui al Gui del jugador
    jumpPurchaseGui.Parent = playerGui

    Las 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:

  1. En la barra de herramientas, haz clic en el botón Jugar . Studio entra en modo de prueba de juego.

    Play button highlighted in Studio's playtesting options.
  2. 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.