Menu
CoddyTech

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.

challenge icon

Défi

Moyen
  1. Dans PetClient : local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). Lors du Button1Down de la souris, si mouse.Target est une pièce nommée CoinPile, déclenche remotes.Hit avec celle-ci.
  2. Dans PetServer : local remotes = game.ReplicatedStorage.Remotes, connecte remotes.Hit.OnServerEvent pour appeler hitPile(player, pile), et supprime le ClickDetector de spawnPile (et la ligne local hitPile : écris plutôt local function hitPile sous 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
quiz iconTestez-vous

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