Menu
CoddyTech

Pièces à l’écran

Leçon 5 sur 20 du cours Jeu Roblox : simulateur d’animaux de Coddy.

Maintenant, le client. PetClient est un LocalScript dans le HUD, un ScreenGui que Roblox copie depuis StarterGui sur l’écran de chaque joueur lorsqu’il apparaît. Un LocalScript s’exécute sur l’appareil de ce joueur et peut déterminer le nom du joueur pour lequel il s’exécute :

local me = game:GetService("Players").LocalPlayer

Dans un Script serveur, LocalPlayer vaut nil : le serveur s’occupe de tous les joueurs à la fois.

Le serveur ajoute leaderstats au joueur un instant après son arrivée ; le client attend donc avec WaitForChild. Il affiche ensuite les pièces dans le libellé Coins du HUD, puis met cet affichage à jour chaque fois que leur nombre change : l’événement Changed d’un IntValue se déclenche avec la nouvelle valeur.

Le libellé affiche uniquement ce que le serveur a décidé. Modifier Coins.Value dans un LocalScript changerait ce que ce joueur voit, et rien sur le serveur.

challenge icon

Défi

Moyen

Affiche les pièces du joueur à l’écran.

  1. Dans PetClient : local Players = game:GetService("Players"), local me = Players.LocalPlayer, local hud = script.Parent.
  2. local coins = me:WaitForChild("leaderstats"):WaitForChild("Coins")
  3. Écris showCoins() : hud.Coins.Text = "Coins: " .. coins.Value. Appelle-la une fois et connecte-la à coins.Changed.

Appuie sur « Jouer » et détruis un tas : en haut à gauche, il est indiqué Coins: 5. Puis clique sur « Vérifier ».

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 pile -> l’emplacement sur lequel elle 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 une pile nécessite hitPile, défini plus bas que spawnPile : déclarez-le
-- ici, avant les deux
local hitPile

-- Une pile 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 la 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é à une pile ;
-- à 0, la pile 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()
	-- une nouvelle pile au même emplacement, quelques secondes plus tard
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Une pile à chaque emplacement de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

Toutes les leçons de Jeu Roblox : simulateur d’animaux

Entraînez-vous par vous-même : Playground Roblox