Haz clic para romper
Lección 6 de 18 del curso Juego de Roblox: simulador de mascotas de Coddy.
Un ClickDetector está bien para un botón, pero la mayoría de los simuladores leen los clics en el cliente, así que el juego puede reaccionar en el momento en que haces clic (con un sonido, una sacudida) antes de que responda el servidor. El mouse del cliente sabe en qué hizo clic:
local mouse = me:GetMouse()
mouse.Button1Down:Connect(function()
print(mouse.Target) -- la pieza debajo del clic, o nil
end)El cliente no puede romper una pila por sí solo: el servidor es dueño de las pilas y las monedas. Lo solicita mediante un RemoteEvent, un objeto creado para enviar mensajes entre el cliente y el servidor:
-- cliente
remotes.Hit:FireServer(pile)
-- servidor: Roblox añade primero al jugador que lo envió
remotes.Hit.OnServerEvent:Connect(function(player, pile)
end)Un evento remoto llega un momento después, como ocurre a través de una red. En un teléfono, un toque es lo mismo que un clic.
Desafío
Intermedio- En
PetClient:local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). Al pulsarButton1Downdel ratón, simouse.Targetes una pieza llamadaCoinPile, llama aremotes.Hitcon ella. - En
PetServer:local remotes = game.ReplicatedStorage.Remotes, conectaremotes.Hit.OnServerEventpara llamar ahitPile(player, pile)y elimina el ClickDetector despawnPile(y la línealocal hitPile: escribelocal function hitPiledebajo de spawnPile en su lugar).
Pulsa Play y haz clic en un montón. Después, Check.
Pruébalo tú mismo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local piles = workspace.Piles
local pileSpot = {} -- cada montón -> el lugar donde está
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Cada jugador recibe Coins en la tabla de clasificación
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Parent = leaderstats
end)
-- El clic en un montón necesita hitPile, que se define después de spawnPile: decláralo
-- aquí, antes de ambas funciones
local hitPile
-- Un montón de monedas en un lugar: una copia de ServerStorage.CoinPile con su salud
-- y su valor como atributos
local function spawnPile(spot)
local pile = ServerStorage.CoinPile:Clone()
pile.Position = spot.Position
pile:SetAttribute("MaxHealth", Settings.PileHealth)
pile:SetAttribute("Health", Settings.PileHealth)
pile:SetAttribute("Value", Settings.PileValue)
-- haz clic en él para golpearlo
local detector = Instance.new("ClickDetector")
detector.Parent = pile
pileSpot[pile] = spot
pile.Parent = piles
detector.MouseClick:Connect(function(player)
hitPile(player, pile)
end)
return pile
end
-- Un golpe reduce en 1 la salud de un montón;
-- al llegar a 0, el montón se rompe y otorga su valor
function hitPile(player, pile)
local health = pile:GetAttribute("Health") - 1
if health > 0 then
pile:SetAttribute("Health", health)
return
end
player.leaderstats.Coins.Value += pile:GetAttribute("Value")
local spot = pileSpot[pile]
pileSpot[pile] = nil
pile:Destroy()
-- un nuevo montón en el mismo lugar, unos segundos después
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Un montón en cada lugar de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Roblox: simulador de mascotas
2Cliente y servidor
Monedas en pantalla