如何在按下但不连续后设置键盘按键事件

时间:2015-04-28 14:12:13

标签: phaser-framework

我使用下面的代码来移动播放器,但问题是只要按下按钮并保持播放器继续移动。如何更改此行为,以便无论按下按钮多长时间,玩家只能移动一次?

if (cursor.up.isDown){
     player.body.velocity.y = -200;
     player.animations.stop('move');
}

3 个答案:

答案 0 :(得分:4)

作为触发开关的布尔应该做的工作:

var flipFlop;

function update() {
    if (cursor.up.isDown){
        if (!flipFlop) {
            player.body.velocity.y = -200;
            player.animations.stop('move');
            flipFlop = true;
        }
    }

    if (cursor.up.isUp) {
        flipFlop = false;
    }
}

请注意,flipFlop变量在更新循环之外声明,否则将在每一帧重新创建。

答案 1 :(得分:1)

Kamen Minkov的回答确实有效,但是如果你的想法是跳跃,那么bool将不会起作用,只要你按下按钮就可以按下它,然后再往上走,甚至不要接触任何地面。

但您可以使用此功能来验证身体是否正在接触

function touchingDown(someone) {
var yAxis = p2.vec2.fromValues(0, 1);
var result = false;
for (var i = 0; i < game.physics.p2.world.narrowphase.contactEquations.length; i++) {
    var c = game.physics.p2.world.narrowphase.contactEquations[i];
    if (c.bodyA === someone.data || c.bodyB === someone.data)        {
        var d = p2.vec2.dot(c.normalA, yAxis); // Normal dot Y-axis
        if (c.bodyA === someone.data) d *= -1;
        if (d > 0.5) result = true;
    }
} return result;
}

并致电发送正文

if ( (cursor.up.isDown) && (touchingDown(player.body)) ){
        player.body.velocity.y = -200;
        player.animations.stop('move');
}

OBS:P2 Physics的功能,但是对于街机来说,身体已经有一个字段,表明它是否正在降落。

答案 2 :(得分:0)

我知道这是一篇老文章,但我也被困在这里,并使用您的示例提出了一个很好的简单解决方案

this.speed = 100
this.player.setVelocity(0,0)
if (this.cursors.left.isDown){
  this.player.setVelocityX(-this.speed)
}else if(this.cursors.right.isDown){
  this.player.setVelocityX(this.speed)
}else{
  this.player.setVelocityX(0)
}if(this.cursors.up.isDown){
  this.player.setVelocityY(-this.speed)
}else if (this.cursors.down.isDown){
  this.player.setVelocityY(+this.speed)
}else{
  this.player.setVelocityY(0)
}

首先,我们将玩家的速度设置为0,0(x和y)。 我们检查x轴上是否有任何更改,否则将其重置为0。 在y轴上检查是否有更改,否则也将其重置为0。

我发现这可以使角色以更流畅的动作运动。并且还允许将左和上等同时按下。 如果您需要角色像这样移动更多的正方形,则将速度更改为.x或.y