Cliquer pour casser
Leçon 6 sur 18 du cours Jeu Roblox : Simulateur d’animaux de Coddy.
Un ClickDetector convient pour un bouton, mais la plupart des jeux de simulation détectent les clics côté client, afin que le jeu puisse réagir dès que tu cliques (un son, une secousse) avant que le serveur réponde. La souris du client sait sur quoi tu as cliqué :
local mouse = me:GetMouse()
mouse.Button1Down:Connect(function()
print(mouse.Target) -- la pièce sous le clic, ou nil
end)Le client ne peut pas casser un tas lui-même : le serveur possède les tas et les pièces. Il en fait la demande au moyen d’un RemoteEvent, un objet conçu pour échanger des messages entre le client et le serveur :
-- client
remotes.Hit:FireServer(pile)
-- serveur : Roblox ajoute d’abord le joueur qui l’a envoyé
remotes.Hit.OnServerEvent:Connect(function(player, pile)
end)Un événement distant arrive un instant plus tard, comme lorsqu’il passe par un réseau. Sur un téléphone, un appui est équivalent à un clic.
Défi
Moyen- Dans
PetClient:local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). Lors duButton1Downde la souris, simouse.Targetest une pièce nomméeCoinPile, déclencheremotes.Hitavec celle-ci. - Dans
PetServer:local remotes = game.ReplicatedStorage.Remotes, connecteremotes.Hit.OnServerEventpour appelerhitPile(player, pile), et supprime le ClickDetector despawnPile(et la lignelocal hitPile: écris plutôtlocal function hitPilesous spawnPile).
Appuie sur Play et clique sur un tas. Puis Check.
Essayez vous-même
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local piles = workspace.Piles
local pileSpot = {} -- chaque tas -> l’emplacement où il se trouve
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Chaque joueur reçoit Coins dans le classement
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)
-- Le clic sur un tas nécessite hitPile, défini après spawnPile : déclarons-le
-- ici, avant les deux
local hitPile
-- Un tas de pièces sur un emplacement : une copie de ServerStorage.CoinPile avec sa santé
-- et sa valeur comme attributs
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)
-- cliquez dessus pour le frapper
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 coup retire 1 point de santé au tas ;
-- à 0, le tas se brise et rapporte sa valeur
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 nouveau tas au même emplacement, quelques secondes plus tard
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Un tas sur chaque emplacement de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Jeu Roblox : Simulateur d’animaux
2Client et serveur
Pièces à l’écran