Kolekcjoner monet
Część sekcji Skryptowanie gier w Roblox ścieżki Lua w Coddy. Lekcja 15 z 24.
Podkładka ze skarbem ustawiła liczbę monet na 100. Moneta powinna dodać 1, co prowadzi do nowego problemu.
Touched uruchamia się dla każdej części ciała, która dotknie obiektu, więc jeden krok na monetę może uruchomić je kilka razy. Dodaj 1 punkt za każdym razem, a jedna moneta da kilka punktów.
Rozwiązaniem jest debounce: zmienna, która zapamiętuje „to już się stało” i sprawia, że kod ignoruje kolejne wywołania:
local used = false
button.Touched:Connect(function(hit)
if not used then
used = true
print("Pressed!")
end
end)not used ma wartość true, gdy used ma wartość false, więc tylko pierwsze dotknięcie przechodzi przez if not used. a and b ma wartość true tylko wtedy, gdy oba warunki są spełnione: if player and not used then wymaga gracza i niewykorzystanej monety.
Aby umożliwić ponowne wykonanie tej czynności później, zaczekaj i zresetuj zmienną: task.wait(3), a następnie used = false. Oczekiwanie wstrzymuje tylko tę funkcję, więc kolejne dotknięcia nadal się pojawiają i są ignorowane, gdy used ma wartość true.
value += 1 to skrócona forma zapisu value = value + 1, a CanTouch = false sprawia, że część przestaje uruchamiać Touched, dopóki nie zostanie ponownie ustawione na true.
Wyzwanie
Średnileaderstats i połączenia Touched są gotowe, ale naciśnij Play i przejdź przez monetę: wartość Coins zwiększa się o więcej niż 1.
Napraw to i dokończ obsługę monet:
- Każda moneta daje dokładnie 1 monetę przy zebraniu (debounce dla każdej monety).
- Zebrana moneta znika:
Transparency1iCanTouchfalse. - Po 3 sekundach pojawia się ponownie (
Transparency0,CanTouchtrue) i można ją zebrać ponownie.
Spróbuj swoich sił
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
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Skryptowanie gier w Roblox
2Pętle i funkcje
Rząd filarówBudowniczy schodówBudowniczy wieżyFabryka monetMigające światłoZnikający most5Twoja pierwsza gra
Twoja pierwsza gra typu obby3Zdarzenia i gracze
Panel dotykowyPodłoga z lawyLeaderstatsKto tego dotknął?Kolekcjoner monetDrzwi na monetyPoćwicz samodzielnie: Kompilator Lua online