Menu
CoddyTech

Collectionneur de pièces

Fait partie de la section Scripting de jeux Roblox du Journey Lua de Coddy. Leçon 15 sur 24.

Le tapis au trésor a défini Coins à 100. Une pièce devrait ajouter 1, et cela entraîne un nouveau problème.

Touched se déclenche pour chaque partie du corps qui le touche ; un seul pas sur une pièce peut donc déclencher l’événement plusieurs fois. Ajoute 1 point à chaque fois et une seule pièce rapporte plusieurs points.

La solution consiste à utiliser un mécanisme anti-rebond : une variable qui mémorise « cela s’est déjà produit » et fait ignorer les répétitions par le code :

local used = false
button.Touched:Connect(function(hit)
	if not used then
		used = true
		print("Pressed!")
	end
end)

not used est true lorsque used est false, donc seul le premier contact passe la condition if not used. a and b est vrai uniquement lorsque les deux sont vrais : if player and not used then nécessite un joueur et une pièce inutilisée.

Pour permettre que cela se reproduise plus tard, attends puis réinitialise la variable : task.wait(3) puis used = false. L’attente met en pause uniquement cette fonction, donc les autres contacts continuent d’arriver et sont ignorés tant que used est true.

value += 1 est une forme abrégée de value = value + 1, et CanTouch = false empêche une pièce de déclencher Touched jusqu’à ce qu’elle soit remise à true.

challenge icon

Défi

Moyen

Les leaderstats et les connexions Touched sont prêts, mais appuie sur Play et traverse une pièce : Coins augmente de plus de 1.

Corrige ça et termine le système de pièces :

  1. Chaque pièce donne exactement 1 Coin par collecte (un debounce par pièce).
  2. Une pièce collectée disparaît : Transparency 1 et CanTouch false.
  3. Elle réapparaît 3 secondes plus tard (Transparency 0, CanTouch true) et peut être collectée à nouveau.

Essayez vous-même

local Players = game:GetService("Players")
local coins = workspace.Coins

Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local coinsValue = Instance.new("IntValue")
	coinsValue.Name = "Coins"
	coinsValue.Value = 0
	coinsValue.Parent = leaderstats
end)

for _, coin in coins:GetChildren() do
	coin.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player then
			player.leaderstats.Coins.Value += 1
		end
	end)
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 Scripting de jeux Roblox

Entraînez-vous par vous-même : Compilateur Lua en ligne