Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio
  1. En PetClient: local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). Al pulsar Button1Down del ratón, si mouse.Target es una pieza llamada CoinPile, llama a remotes.Hit con ella.
  2. En PetServer: local remotes = game.ReplicatedStorage.Remotes, conecta remotes.Hit.OnServerEvent para llamar a hitPile(player, pile) y elimina el ClickDetector de spawnPile (y la línea local hitPile: escribe local function hitPile debajo 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
quiz iconPonte a prueba

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