Actionscript 3 相当于 KeyboardEvent.Repeat

Actionscript 3 equivalent of KeyboardEvent.Repeat

在编程方面,我是一个初学者;我在 Adob​​e Animator 上为我的 2D 游戏 class 做一个 flash 游戏,我对我的导师无法自己回答的代码有疑问。长话短说,我希望字符速度根据按下键的时间而增加,所以我想到了这个:

spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);

只要按住键,可变速度就会增加,我会检查它是否与 KeyboardEvent.repeat,如:

if(heldDown){while(heldDown){tempo += 1}}
else{tempo = 0}

spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);

然而,当我尝试这样做时,输出响应为“属性 repeat not found on flash.events.KeyboardEvent and there is no default value”。我认为这是因为 KeyboardEvent.repeat 没有在我使用的媒体中定义。无论如何,我是否可以重现 KeyboardEvent.repeat 的 相同效果 ,也许是通过创建一个模仿它会做的事情的函数?

提前致谢。

(编辑 1)

我开始为我的澄清不足以及我对这个主题的无知表示歉意,因为我在 as3 方面还不是初学者,而且我还没有正确地介绍我读过的许多术语。

因此,感谢评论的有意义的贡献,我已经大致了解了我需要采取什么样的解决方法来替代 KeyboardEvent.repeat。与问题相关的代码还有其他部分:

stage.addEventListener(KeyboardEvent.KEY_DOWN,pressKey)

function pressKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = true;}
(...)
}

stage.addEventListener(KeyboardEvent.KEY_UP,releaseKey)

function releaseKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = false;}
(...)
}

代码就是这样设计的。有人建议我使用getTimer()方法来记录事件KEY_DOWN发生的时刻,当KEY_UP[=46时停止=] 生效。问题是,我如何增加代码以使其区分这两个事件,更具体地说,我如何调整 ENTER_FRAME 事件,以便区分它们仍然有效吗? 顺便说一下,这是其中最相关的部分:

addEventListener(Event.ENTER_FRAME,walk);

function walk(Event) {
    if(left) { 
            (...)
            char.x -= spdX;
            (...)
            }

我假设代码一直运行到现在,因为随着 "left" 的状态不断在 "true" 和 "false" 之间切换,if 重复满足条件,导致角色移动。但是,如果我尝试使条件依赖于 "left" 在 "true" 停留一段时间,代码就会变得与自身不兼容。

简而言之,它带来了如何适配 "KEY_[]" 事件侦听器和 "walk" 函数一起工作的问题,在使用 getTimer() 方法时,一起工作。

再次感谢。

我相信这在某种程度上是不言自明的。

stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onUp);
addEventListener(Event.ENTER_FRAME, onFrame);

var pressedKeyA:int;

// Never name variables and arguments with the same name
// as existing classes, however convenient that might seem.
function onDown(e:KeyboardEvent):void
{
    if (e.keyCode == Keyboard.A)
    {
        // Let's record the moment it was pressed.
        pressedKeyA = getTimer();
    }
}

function onUp(e:KeyboardEvent):void
{
    if (e.keyCode == Keyboard.A)
    {
        // Mark the key as not pressed.
        pressedKeyA = 0;
    }
}

function onFrame(e:Event):void
{
    // It is true if it is not 0.
    if (pressedKeyA)
    {
        // That's how long it has been pressed. In milliseconds.
        var pressedFor:int = getTimer() - pressedKeyA;

        // Change the position with regard to it.
        // For example 1 base + 1 per second.
        char.x -= 1 + pressedFor / 1000;
    }
}