Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

leaderstats 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:

  1. Każda moneta daje dokładnie 1 monetę przy zebraniu (debounce dla każdej monety).
  2. Zebrana moneta znika: Transparency 1 i CanTouch false.
  3. Po 3 sekundach pojawia się ponownie (Transparency 0, CanTouch true) 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
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Lua online