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.
Défi
MoyenLes 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 :
- Chaque pièce donne exactement 1 Coin par collecte (un debounce par pièce).
- Une pièce collectée disparaît :
Transparency1etCanTouchfalse. - Elle réapparaît 3 secondes plus tard (
Transparency0,CanTouchtrue) 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
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
2Boucles et fonctions
Rangée de piliersConstructeur d’escalierConstructeur de tourFabrique de piècesLumière clignotantePont qui disparaît5Votre premier jeu
Votre premier Obby3Événements et joueurs
Pavé tactileSol de laveLeaderstatsQui l’a touché ?Collectionneur de piècesPorte à piècesEntraînez-vous par vous-même : Compilateur Lua en ligne