Добавленные очки продолжают умножаться в Roblox - PullRequest
0 голосов
/ 07 марта 2020

У меня есть скрипт, который должен давать 5 очков за каждое убийство. Однако при первом убийстве он дает 0 очков. На втором - 5, на третьем - 10 и т. Д. Я не могу понять, что является причиной этого.

Часть дробилки запускает событие, когда что-то умирает на нем. Затем он берется другим сценарием, чтобы дать очки, если кнопка дробилки использовалась во время убийства. https://youtu.be/06c4KFsvIzQ

- скрипт дробилки -

local debounce = false
script.Parent.Touched:Connect(function(OnTouched)
    if not debounce then
        debounce = true
        local hum = OnTouched.Parent:FindFirstChild("Humanoid")
        if hum ~= nil and hum.Health ~= 0 then
            hum.Health = 0
            script.GotKill:Fire()
        end
        debounce = false
    end
end)

- скрипт кнопки -

local pos = script.Parent.Parent.Parent.Part.Position
local Crusher = script.Parent.Parent.Parent.Part
local wall1= script.Parent.Parent.Parent.bobbade
local wall2 = script.Parent.Parent.Parent.bebbade
local pos2 = script.Parent.Parent.Position
local debounce = false

script.Parent.MouseClick:Connect(function(Clicked)
    if not debounce then
        debounce = true
        script.Parent.Parent.Position = pos2 - Vector3.new(0,0.5,0)
        Crusher.Position = Crusher.Position - Vector3.new(0,1,0)
        wall1.Position = wall1.Position - Vector3.new(0,1,0)
        wall2.Position = wall2.Position - Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position - Vector3.new(0,1,0)
        wall1.Position = wall1.Position - Vector3.new(0,1,0)
        wall2.Position = wall2.Position - Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position - Vector3.new(0,1,0)
        wall1.Position = wall1.Position - Vector3.new(0,1,0)
        wall2.Position = wall2.Position - Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position - Vector3.new(0,1,0)
        wall1.Position = wall1.Position - Vector3.new(0,1,0)
        wall2.Position = wall2.Position - Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position - Vector3.new(0,1,0)
        wall1.Position = wall1.Position - Vector3.new(0,1,0)
        wall2.Position = wall2.Position - Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position - Vector3.new(0,1,0)
        wall1.Position = wall1.Position - Vector3.new(0,1,0)
        wall2.Position = wall2.Position - Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position - Vector3.new(0,1,0)
        wall1.Position = wall1.Position - Vector3.new(0,1,0)
        wall2.Position = wall2.Position - Vector3.new(0,1,0)
        wait(1)
        Crusher.Position = Crusher.Position + Vector3.new(0,1,0)
        wall1.Position = wall1.Position + Vector3.new(0,1,0)
        wall2.Position = wall2.Position + Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position + Vector3.new(0,1,0)
        wall1.Position = wall1.Position + Vector3.new(0,1,0)
        wall2.Position = wall2.Position + Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position + Vector3.new(0,1,0)
        wall1.Position = wall1.Position + Vector3.new(0,1,0)
        wall2.Position = wall2.Position + Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position + Vector3.new(0,1,0)
        wall1.Position = wall1.Position + Vector3.new(0,1,0)
        wall2.Position = wall2.Position + Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position + Vector3.new(0,1,0)
        wall1.Position = wall1.Position + Vector3.new(0,1,0)
        wall2.Position = wall2.Position + Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position + Vector3.new(0,1,0)
        wall1.Position = wall1.Position + Vector3.new(0,1,0)
        wall2.Position = wall2.Position + Vector3.new(0,1,0)
        wait()
        Crusher.Position = Crusher.Position + Vector3.new(0,1,0)
        wall1.Position = wall1.Position + Vector3.new(0,1,0)
        wall2.Position = wall2.Position + Vector3.new(0,1,0)
        script.Parent.Parent.Position = pos2
        script.Parent.Parent.Parent.Part.Script.GotKill.Event:Connect(function(OnKill)
            Clicked.leaderstats.Gold.Value = Clicked.leaderstats.Gold.Value + 5
        end)
        debounce = false
    end
end)

1 Ответ

2 голосов
/ 08 марта 2020

Вы по сути добавляете прослушиватель событий каждый раз, когда нажимаете на кнопку. Когда вы упрощаете код, нажатый на кнопку, вы получаете следующее:

script.Parent.MouseClick:Connect(function(Clicked)
    -- add a listener for the GotKill signal to fire
    script.Parent.Parent.Parent.Part.Script.GotKill.Event:Connect(function(OnKill)
        -- update the score
        Clicked.leaderstats.Gold.Value = Clicked.leaderstats.Gold.Value + 5
    end)
end)

При первом нажатии кнопки событие GotKill, вероятно, срабатывает до того, как вы добавите прослушиватель для нее, так что вы получите ноль очков. Теперь у вас есть один обратный вызов, который сработает при срабатывании события GotKill.

Во второй раз ваш первый обратный вызов обнаружит пропущенный вами сигнал, вы получите свои 5 баллов, а затем добавите еще одного слушателя. Теперь у вас есть два обратных вызова, прослушивающих сигнал.

В третий раз, ваши два предыдущих обратных вызова срабатывают, теперь вы получаете 5 очков, добавленных дважды за 10 очков, затем вы добавляете другого слушателя и т. Д.

Чтобы исправить это, переместите соединение с событием GotKill выше в функции MouseClick, затем отключите его, когда анимация закончится.

- Сценарий кнопки -

local pos = script.Parent.Parent.Parent.Part.Position
local pos2 = script.Parent.Parent.Position
local Crusher = script.Parent.Parent.Parent.Part
local wall1 = script.Parent.Parent.Parent.bobbade
local wall2 = script.Parent.Parent.Parent.bebbade

local debounce = false

-- play an animation on MouseClick
script.Parent.MouseClick:Connect(function(Clicked)
    if not debounce then
        debounce = true

        -- listen for the signal to update the score
        local connection = Crusher.Script.GotKill.Event:Connect( function()
            Clicked.leaderstats.Gold.Value = Clicked.leaderstats.Gold.Value + 5
        end)

        -- play the crusher animation

        -- clean up the GotKill listener
        connection:Disconnect()

        debounce = false
    end
end)
...