Menu
CoddyTech

Clicca per rompere

Lezione 6 di 18 del corso Gioco Roblox: Simulatore di animali domestici di Coddy.

Un ClickDetector va bene per un pulsante, ma la maggior parte dei simulatori rileva i clic sul client, così il gioco può reagire nel momento in cui fai clic (con un suono, una vibrazione) prima che il server risponda. Il mouse del client sa su cosa hai fatto clic:

local mouse = me:GetMouse()
mouse.Button1Down:Connect(function()
	print(mouse.Target) -- la parte sotto il clic, oppure nil
end)

Il client non può rompere da solo una pila: il server gestisce le pile e le monete. Lo chiede tramite un RemoteEvent, un oggetto creato per inviare messaggi tra client e server:

-- client
remotes.Hit:FireServer(pile)
-- server: Roblox aggiunge per primo il giocatore che l'ha inviato
remotes.Hit.OnServerEvent:Connect(function(player, pile)
end)

Un evento remoto arriva qualche istante dopo, come avviene su una rete. Su un telefono, un tocco equivale a un clic.

challenge icon

Sfida

Medio
  1. In PetClient: local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). Quando si verifica Button1Down del mouse, se mouse.Target è una parte chiamata CoinPile, invia remotes.Hit con essa.
  2. In PetServer: local remotes = game.ReplicatedStorage.Remotes, collega remotes.Hit.OnServerEvent per chiamare hitPile(player, pile) e rimuovi il ClickDetector da spawnPile (e la riga local hitPile: scrivi invece local function hitPile sotto spawnPile).

Premi Play e fai clic su un mucchio. Poi Check.

Provalo tu

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local piles = workspace.Piles
local pileSpot = {} -- ogni mucchio -> il punto in cui si trova

print("A Meadow pile gives " .. Settings.PileValue .. " coins")

-- Ogni giocatore riceve Coins nella classifica
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)

-- Il clic su un mucchio richiede hitPile, definita sotto spawnPile: dichiarala
-- qui, prima di entrambe
local hitPile

-- Un mucchio di monete in un punto: una copia di ServerStorage.CoinPile con la sua salute
-- e il suo valore come attributi
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)
	-- fai clic sul mucchio per colpirlo
	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 colpo riduce di 1 la salute di un mucchio;
-- a 0, il mucchio si rompe e assegna il suo valore
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 nuovo mucchio nello stesso punto, qualche secondo dopo
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Un mucchio in ogni punto di Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Roblox: Simulatore di animali domestici