as3 想要删除EventListener KeyboardEvent 以防止额外的文本输入并仅允许 1 个键盘事件

问题描述 投票:0回答:1

我正在构建一个简单的动画,我想使用任何按键前进,直到时间轴中的某个帧,我想禁用任何随机按键并仅启用 Enter 键前进到下一帧。

我不太擅长 AS3,并且在时间线内删除 EventListener 似乎对我不起作用(因为我显然做错了)。

这是我使用任何键前进的代码(除了 kb Left 和 Up)

stage.addEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1);
stage.addEventListener(KeyboardEvent.KEY_UP, resetKeyListener);

function pressAnyKeyAdvanceButLeftGoBackward1(event:KeyboardEvent):void
{
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1);
    switch (event.keyCode)
    {
        case Keyboard.LEFT :
            prevFrame();
            break;
                
        case Keyboard.UP :
            gotoAndStop(1);
            break;

        default :
            nextFrame();
            break;
    }
} 

function resetKeyListener(event:KeyboardEvent):void
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1);
} 

然后我想删除(或禁用)它并将其放在原来的位置

stage.removeEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1);

stage.addEventListener(KeyboardEvent.KEY_DOWN, enterkey1);
function enterkey1(event:KeyboardEvent):void {

    if (event.keyCode==13) {
        gotoAndStop(26);
        stage.removeEventListener(KeyboardEvent.KEY_DOWN, enterkey1);
    }
}

这似乎并没有删除 pressanykey 键盘事件,因为它仍然随着随机按键而前进。任何指导将非常感激。

actionscript-3 removeeventlistener
1个回答
0
投票

在 keyUp 上重新添加事件侦听器的 resetKeyListener 函数对我来说似乎有点不必要。

如果您担心每帧都会重复添加事件监听器,我建议将您的时间线包含在 MovieClip 中,并在父级上编写代码,以便每次时间线动画的帧发生变化时都不会重新执行代码.

我还建议您可能不需要 2 个不同的关键处理函数,而可以只使用 1 个函数,其中包含确定结果行为的逻辑。这样您就不必担心添加和删除事件侦听器。

例如,如果您在名为“timelineMC”的 MovieClip 中有时间轴动画,则父级上的代码可能如下所示:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler);

function keyHandler(event:KeyboardEvent):void
{
    if (timelineMC.currentFrame < 26) 
    {
        switch (event.keyCode)
        {
            case Keyboard.LEFT :
                timelineMC.prevFrame();
            break;
            
            case Keyboard.UP :
                timelineMC.gotoAndStop(1);
            break;
    
            default :
                timelineMC.nextFrame();
            break;
        }
    } else if (event.keyCode == Keyboard.ENTER) {
        timelineMC.nextFrame();
    }
} 

这样如果时间轴MC的当前帧小于26,将使用switch语句的逻辑。否则,仅当键码为 Keyboard.ENTER

时才前进帧
© www.soinside.com 2019 - 2024. All rights reserved.