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.
Sfida
Medio- In
PetClient:local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). Quando si verificaButton1Downdel mouse, semouse.Targetè una parte chiamataCoinPile, inviaremotes.Hitcon essa. - In
PetServer:local remotes = game.ReplicatedStorage.Remotes, collegaremotes.Hit.OnServerEventper chiamarehitPile(player, pile)e rimuovi il ClickDetector daspawnPile(e la rigalocal hitPile: scrivi invecelocal function hitPilesotto 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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.