Script un botón de mejora

*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 recoger monedas y perderlas cuando mueren, pero las monedas no hacen nada, y la mayor parte del mundo 3D es inaccesible sin la capacidad de saltar muy alto. Esta sección del tutorial te enseña cómo finalizar la lógica de tu juego añadiendo un botón en pantalla que gasta monedas para aumentar el poder de salto.

Crear el botón de mejora

Las interfaces 2D en Roblox generalmente están compuestas por una colección de componentes de GUI dentro de un contenedor de GUI. En este caso, solo necesitas un componente TextButton que diga Mejorar Salto (5 Monedas) dentro de un contenedor ScreenGui.

Configurar la GUI de mejora
En ReplicatedStorage, crea una carpeta llamada Instances.
Dentro de la carpeta Instances, crea un ScreenGui llamado JumpPurchaseGui con ResetOnSpawn desactivado.
Dentro de JumpPurchaseGui, crea un TextButton llamado JumpButton con las siguientes propiedades:
- Text: "Mejorar Salto (5 Monedas)"
- TextSize: 25
- AnchorPoint: 1, 1
- Position: {1, 0}, {1, 0}
También dentro de la carpeta Instances, crea una RemoteFunction llamada IncreaseJumpPowerFunction.
Finalmente, en el servicio StarterPlayer, habilita la propiedad CharacterUseJumpPower.

Definir datos de poder de salto

Actualmente, solo se almacena la cantidad de monedas para cada jugador en el script del módulo PlayerData. También necesitas almacenar y actualizar el poder de salto de la misma manera. Dado que las funciones en PlayerData no son específicas para los datos que se están cambiando, lo único que se requiere para almacenar el poder de salto del jugador es agregar una clave Jump e inicializar su valor inicial en defaultPlayerData().

Actualizar PlayerData con poder de salto
En ServerStorage, reemplaza el código existente del módulo PlayerData con el siguiente:
```lua
local PlayerData = {}
PlayerData.COIN_KEY_NAME = "Coins"
PlayerData.JUMP_KEY_NAME = "Jump"
local playerData = {
--[[
[userId: string] = {
["Coins"] = coinAmount: number,
["Jump"] = jumpPower: number
}
--]]
}
local function defaultPlayerData()
return {
[PlayerData.COIN_KEY_NAME] = 0,
[PlayerData.JUMP_KEY_NAME] = 0,
}
end
local function getData(player)
local data = playerData[tostring(player.UserId)] or defaultPlayerData()
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 datos de poder de salto

Ahora que PlayerData puede rastrear el poder de salto, necesitas implementar lógica en el servidor para mejorar el poder de salto a partir de una solicitud del cliente del jugador.

El servidor y el cliente pueden comunicarse a través de RemoteEvents o RemoteFunctions. Los eventos remotos no esperan cuando se activan y pueden usarse para comunicación unidireccional. Las funciones remotas, por otro lado, esperan hasta recibir una respuesta, lo que permite la comunicación bidireccional.

Para este tutorial, el cliente necesita saber si el servidor mejoró con éxito el poder de salto del jugador, por lo que deberías usar una función remota.

Crear JumpService
En ServerScriptService, crea un Script llamado JumpService con el siguiente código:
```lua
-- 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)
-- Actualiza la tabla de poder de salto
local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
-- Actualiza el poder de salto del jugador
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.JumpPower = newJumpPower
-- Actualiza el leaderboard de salto
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
-- Aumenta el poder de salto del jugador
updateJumpPower(player, function(oldJumpPower)
oldJumpPower = oldJumpPower or 0
return oldJumpPower + JUMP_POWER_INCREMENT
end)
-- Actualiza la tabla de monedas
local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
return oldCoinAmount - JUMP_COIN_COST
end)
-- Actualiza el leaderboard de monedas
Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
return true
end
local function onCharacterAdded(player)
-- Restablece el poder de salto del jugador cuando se añade el personaje
updateJumpPower(player, function(_)
return 0
end)
end
-- Inicializa cualquier jugador añadido antes de conectarse al evento PlayerAdded
for _, player in Players:GetPlayers() do
onCharacterAdded(player)
end
-- Inicialización normal 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 poder de salto - updateJumpPower() actualiza el poder de salto del jugador y el leaderboard para proporcionar retroalimentación visual. Esta función se asemeja al código que daña a los jugadores en Crear peligros para jugadores. Siempre que exista un modelo Character y Humanoid para el jugador que se está mejorando, la función actualiza la propiedad JumpPower al nuevo valor almacenado por PlayerData, aumentándolo en 30. Si deseas que tu juego dure un poco más, puedes disminuir este número.

  • Validar solicitudes del servidor - onPurchaseJumpIncrease() primero verifica que el jugador realmente tenga la cantidad de monedas necesarias para comprar la mejora. Todas las solicitudes de los clientes al servidor deben ser validadas para evitar que actores malintencionados envíen solicitudes falsas y exploten tu juego.

Agregar el botón a la GUI del jugador

Un objeto ScreenGui solo se muestra en pantalla si está parentado al objeto PlayerGui de un jugador. Por defecto, esto contiene la GUI del sistema, como la ventana de chat. Ahora necesitas crear un script en ReplicatedStorage para copiar el botón de mejora en la GUI de cada jugador e implementar el comportamiento para cuando se presiona el botón.

Crear JumpButtonClickHandler
En ReplicatedStorage, crea un Script llamado JumpButtonClickHandler con RunContext establecido en Client y el siguiente código:
```lua
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
-- purchased será el mensaje de error si success es falso
error(purchased)
elseif success and not purchased then
warn("¡No hay suficientes monedas!")
end
end
jumpButton.Activated:Connect(onButtonClicked)
-- Agrega el JumpPurchaseGui a la GUI del jugador
jumpPurchaseGui.Parent = playerGui
```

Las siguientes secciones describen el código con más detalle.

  • Obtener referencias a la GUI y la función del servidor - Las variables IncreaseJumpPowerFunction, jumpPurchaseGui, y jumpButton contienen referencias a la función y la GUI que llama a la función que necesitarás más adelante.
  • Definir el manejador de eventos - onButtonClicked() define la lógica para cuando los usuarios hacen clic en el botón de mejora. Utiliza pcall() (llamada protegida) para invocar la RemoteFunction. Cualquier comunicación cliente-servidor como esta requiere pcall() para manejar errores o problemas de conexión.
  • Conectar el manejador al botón - El evento Activated es compatible en todas las plataformas, incluyendo mouse, pantalla táctil o contextos de gamepad. Se activa cuando se libera un clic, toque o botón de gamepad.

Prueba de juego

Selecciona Test en el menú desplegable y haz clic en Play. El botón Mejorar Salto aparece en la esquina inferior derecha.

Intenta hacer clic en el botón antes de recoger monedas para verificar que no te otorgue poder de salto adicional, luego intenta recoger algunas monedas y verifica si la mejora funciona cuando haces clic nuevamente.

Con el código completo, intenta ajustar la dificultad: añade monedas si el ritmo se siente lento, o quita algunas y colócalas en lugares más difíciles si las mejoras son demasiado fáciles.

©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.