Menu
CoddyTech

Сборщик монет

Часть раздела Скриптинг игр в Roblox путешествия по Lua на Coddy. Урок 15 из 24.

Площадка с сокровищами установила количество монет на 100. Монета должна добавлять 1, и это приводит к новой проблеме.

Событие Touched срабатывает для каждой части тела, которая касается монеты, поэтому один шаг на монету может вызвать его несколько раз. Добавляйте по 1 очку каждый раз — и одна монета даст несколько очков.

Решение — защита от повторного срабатывания: переменная, которая запоминает «это уже произошло» и заставляет код игнорировать повторы:

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

not used равно true, пока used равно false, поэтому только первое касание проходит проверку if not used. a and b равно true, только когда оба значения равны true: if player and not used then требует наличия игрока и ещё не использованной монеты.

Чтобы это могло произойти снова позже, подожди и сбрось значение: task.wait(3), затем used = false. Ожидание приостанавливает только эту функцию, поэтому другие касания продолжают поступать и игнорируются, пока used равно true.

value += 1 — это сокращённая запись value = value + 1, а CanTouch = false заставляет часть перестать вызывать Touched, пока для неё снова не будет установлено значение true.

challenge icon

Задание

Средне

leaderstats и подключения Touched готовы, но нажми Play и пройди через монету: значение Coins увеличивается больше чем на 1.

Исправь это и заверши создание монет:

  1. За каждое поднятие монета даёт ровно 1 Coin (дебаунс для каждой монеты).
  2. Собранная монета исчезает: Transparency 1 и CanTouch false.
  3. Через 3 секунды она возвращается (Transparency 0, CanTouch true) и её можно собрать снова.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Скриптинг игр в Roblox

Потренируйтесь самостоятельно: Онлайн-компилятор Lua