Сборщик монет
Часть раздела Скриптинг игр в 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.
Задание
Среднеleaderstats и подключения Touched готовы, но нажми Play и пройди через монету: значение Coins увеличивается больше чем на 1.
Исправь это и заверши создание монет:
- За каждое поднятие монета даёт ровно 1 Coin (дебаунс для каждой монеты).
- Собранная монета исчезает:
Transparency1иCanTouchfalse. - Через 3 секунды она возвращается (
Transparency0,CanTouchtrue) и её можно собрать снова.
Попробуйте сами
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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Скриптинг игр в Roblox
2Циклы и функции
Ряд столбовСтроитель лестницСтроитель башенФабрика монетМигающий светИсчезающий мост5Ваша первая игра
Ваш первый обби3События и игроки
Сенсорная панельПол из лавыLeaderstatsКто это коснулся?Сборщик монетДверь с монетойПотренируйтесь самостоятельно: Онлайн-компилятор Lua