0

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

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

只要按住键,可变速度就会增加,我会检查它是否与 KeyboardEvent.repeat 一起使用,如下所示:

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

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

但是,当我尝试这样做时,输出会响应“在 flash.events.KeyboardEvent 上找不到属性重复并且没有默认值”。我认为这是因为 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生效时停止。问题是,如何增加代码以使其区分这两个事件,更具体地说,如何调整ENTER_FRAME事件以便区分它们仍然可以使用?顺便说一下,这是其中最相关的部分:

addEventListener(Event.ENTER_FRAME,walk);

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

我假设代码一直运行到现在,因为“左”的状态不断在“真”和“假”之间切换,反复满足if条件,导致角色移动。但是,如果我尝试使条件依赖于“左”在一段时间内保持“真”,则代码将与自身不兼容。

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

再次,提前感谢。

4

1 回答 1

1

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

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;
    }
}
于 2018-10-29T14:32:04.897 回答