首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何阻止一个键检测脚本多次记录同一个键?

如何阻止一个键检测脚本多次记录同一个键?
EN

Stack Overflow用户
提问于 2021-05-11 10:22:08
回答 1查看 113关注 0票数 0

我目前有一个问题,我设置了一个键来启动一个过程,然后按下另一个键来上下移动,但是如果我释放第一个键,然后再次点击它,滚动的数量就会成倍增加(我想)。例如,我按“G”键,然后按“U”键向上,按“J”键向下。当我第一次按住“G”时,它工作得无懈可击。但是,如果我松开“G”键,然后再次按下它来滚动更多内容,当我按一次“U”键时,它会输入两次。如果我松开并再次按“G”滚动,它显示我按了“U”或“J”3次。我是不是遗漏了一些非常简单的东西?以下是示例代码。

代码语言:javascript
运行
复制
userInput.InputBegan:Connect(function(input, gameProcessed)
    
    if not gameProcessed then
        
        print("Not game processed!")
        if input.KeyCode == Enum.KeyCode.G then 
            
            print("G is Held")
            
            userInput.InputBegan:Connect(function(input2, gP)
                
                local db = false
                
                if not gP then
                    
                    print("Also not game processed!")
                    
                    if input2.KeyCode == Enum.KeyCode.U and input.KeyCode == Enum.KeyCode.G then
                        
                        print("U was pressed!")
                        
                        if not db then
                            db = true
                            print("db: "..tostring(db))

                            if Multi + 1 > 20 then

                                Multi = 20

                            else

                                Multi = Multi + 1
                                print("Multi: "..Multi)

                            end

                            print("Multi: "..Multi)
                            wait(0.5)
                            db = false
                            print("db: "..tostring(db))
                            
                        end
                        
                    elseif input2.KeyCode == Enum.KeyCode.J and input.KeyCode == Enum.KeyCode.G then
                        
                        print("J was pressed!")
                        
                        if Multi - 1 < 2 then
                            
                            Multi = 2
                            
                        else
                            
                            Multi = Multi - 1
                            print("Multi: "..Multi)
                            
                        end
                        
                        print("Multi: "..Multi)
                        
                    end
                    
                end
                
            end)
            
        end
        
    end
    
end)

编辑:

我让它强制停止我的keyPressed事件,但我仍然有增加滴答的问题,正如你所说的,这是由于多个keyPressed事件开始。我有一个将keysPressed设置为nil的inputEnded函数。下面是我更新的代码:

代码语言:javascript
运行
复制
local function onInputBegan(input, gameProcessed)
    
    if gameProcessed then
        return
    end
    
    pressedKeys[input.KeyCode] = true
    
    if pressedKeys[Enum.KeyCode.G] then
        
        gDown = true
        
        if not debounce then

            debounce = true

            if hasPower.Value then

                if powerEquipped.Value == "PowerUp" then
                    
                    while gDown do
                        
                        print("LOOP!")
                        
                        if isPowered.Value == true then
                            
                            gDown = false
                            isPowered.Value = false
                            multi.Value = multi.Value / Multi
                            print("Exited Power!")
                            print("G reset!")
                            break

                        elseif powerStamCost.Value <= stam.Value and stam.Value > powerStamDrain.Value and not isPowered.Value then

                            baseChargeTicks = ((((Multi - 2) * (1 / 6)) + 2) * 4)

                            if chargeTicks >= baseChargeTicks then
                                
                                gDown = false
                                print("In Power")
                                chargeTicks = 0
                                stam.Value = stam.Value - powerStamCost.Value
                                multi.Value = multi.Value * Multi
                                isPowered.Value = true
                                wait(staminaRate)
                                chargeTicks = 0
                                print("G Reset!")
                                break
                                
                            else
                                
                                chargeTicks = chargeTicks + 1
                                wait(increment)                             
                                print("charge: "..chargeTicks.."/"..baseChargeTicks)
                                
                            end
                            
                        end

                    end

                end

            end
            
        end
        
        debounce = false
        
    end
    
    if pressedKeys[Enum.KeyCode.U] then

        if hasPower.Value then

            if powerEquipped.Value == "PowerUp" then

                if Multi + 1 > 20 then

                    Multi = 20

                else

                    Multi = Multi + 1
                    print("Multi: "..Multi)

                end

                chargeTicks = 0

            end

        end

    elseif pressedKeys[Enum.KeyCode.J] then

        if hasPower.Value then

            if powerEquipped.Value == "PowerUp" then

                if Multi - 1 < 2 then

                    Multi = 2

                else

                    Multi = Multi - 1
                    print("Multi: "..Multi)

                end

                chargeTicks = 0

            end

        end

    end
    
end

以下是尝试使用密钥时的打印输出:

15:30:02.097循环!-客户端-通电:46

15:30:02.348收费: 1/8 -客户端-电源:78

15:30:02.348循环!-客户端-通电:46

15:30:02.363多:3客户端-通电:109

15:30:02.513循环!-客户端-通电:46

15:30:02.613收费: 0/8.6666666666667 -客户端-电源:78

15:30:02.614循环!-客户端-通电:46

15:30:02.646多:4客户端-通电:109

15:30:02.764收费: 0/8.6666666666667 -客户端-电源:78

15:30:02.764▶循环!(x2) -客户端-通电:46

15:30:02.864收费: 0/9.3333333333333 -客户端-电源:78

15:30:02.864循环!-客户端-通电:46

15:30:02.947多:5客户端-通电:109

15:30:03.017收费: 0/9.3333333333333 -客户端-电源:78

15:30:03.017循环!-客户端-通电:46

15:30:03.031收费: 1/10 -客户端-电源:78

15:30:03.031▶循环!(x2) -客户端-通电:46

15:30:03.130收费: 3/10 -客户端-电源:78

15:30:03.130循环!-客户端-通电:46

15:30:03.214多:6客户端-通电:109

15:30:03.280收费: 0/10 -客户端-电源:78

15:30:03.280循环!-客户端-通电:46

15:30:03.297收费: 1/10.666666666667 -客户端-电源:78

15:30:03.297循环!-客户端-通电:46

15:30:03.331收费: 2/10.666666666667 -客户端-电源:78

15:30:03.331▶循环!(x2) -客户端-通电:46

15:30:03.397收费: 4/10.666666666667 -客户端-电源:78

15:30:03.397循环!-客户端-通电:46

15:30:03.479多:7-客户端-通电:109

15:30:03.547收费: 0/10.666666666667 -客户端-电源:78

15:30:03.548循环!-客户端-通电:46

15:30:03.548收费: 1/11.333333333333 -客户端-电源:78

15:30:03.548循环!-客户端-通电:46

15:30:03.598收费: 2/11.333333333333 -客户端-电源:78

15:30:03.598循环!-客户端-通电:46

15:30:03.614收费: 3/11.333333333333 -客户端-电源:78

15:30:03.614循环!-客户端-通电:46

15:30:03.664收费: 4/11.333333333333 -客户端-电源:78

15:30:03.664循环!-客户端-通电:46

15:30:03.814收费: 5/11.333333333333 -客户端-电源:78

15:30:03.814循环!-客户端-通电:46

15:30:03.814收费: 6/11.333333333333 -客户端-电源:78

15:30:03.814循环!-客户端-通电:46

15:30:03.863收费: 7/11.333333333333 -客户端-电源:78

15:30:03.864循环!-客户端-通电:46

15:30:03.881收费: 8/11.333333333333 -客户端-电源:78

15:30:03.881循环!-客户端-通电:46

15:30:03.914收费: 9/11.333333333333 -客户端-电源:78

15:30:03.915循环!-客户端-通电:46

15:30:04.064收费: 10/11.333333333333 -客户端-电源:78

15:30:04.064循环!-客户端-通电:46

15:30:04.064收费: 11/11.333333333333 -客户端-电源:78

15:30:04.064循环!-客户端-通电:46

15:30:04.114收费: 12/11.333333333333 -客户端-电源:78

15:30:04.114循环!-客户端-通电:46

PowerUp中的15:30:04.114 -客户端-通电:64

15:30:04.114通过Multi!- Client - PowerDisplayScript:84重新计算奖金

15:30:04.114通过奖励重新计算功率!-客户端- PowerDisplayScript:98

15:30:04.130健康排泄!!- Client - HealthBarScript:40

15:30:04.147▶费用: 0/11.333333333333 (x4) -客户端-电源:78

15:30:05.130 G重置!-客户端-通电:71

15:30:05.163▶健康排泄!!(x5) -客户端-健康栏脚本:40

15:30:09.948循环!-客户端-通电:46

15:30:09.948通过Multi!- Client - PowerDisplayScript:84重新计算奖金

15:30:09.949通过奖励重新计算功率!-客户端- PowerDisplayScript:98

15:30:09.949退出PowerUp!-客户端-通电:53

15:30:09.949 G重置!-客户端-通电:54

EN

回答 1

Stack Overflow用户

发布于 2021-05-11 15:52:15

这实际上很简单。

每次按G键时,都会将另一个事件侦听器连接到InputBegan事件。

因此,在按G3次之后,您将有3个相同的事件侦听器,它们响应J或D,导致观察到的三重输入。它们将按照连接的顺序被调用。

如果不再需要事件处理程序,则将其断开。这可以使用InputEnded事件来完成。如果G被释放,则断开处理U和J的监听程序。

或者,为了添加一个新的监听器,您也可以使用一个变量来存储G正在被按下的信息。

简单的、未经测试的示例:

代码语言:javascript
运行
复制
local pressedKeys = {}

local function = OnInputBegan(input)
  pressedKeys[input.KeyCode] = true

  if pressedKeys[Enum.KeyCode.G] and pressedKeys[Enum.KeyCode.U] then
    print("G and U are down!")
  end
end

local function OnInputEnded(input)
  pressedKeys[input.KeyCode] = nil
end
local userInput = game:GetService("UserInputService")    
userInput.InputBegan:Connect(OnInputBegan)
userInput.InputEnded:Connect(OnInputEnded)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67479741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档