关于javascript:Phaser,使按钮点击事件连续

Phaser, make a button click event continuous

我正在使用 Phaser.js 创建一个地图(tileSprite)并在上面放置一些sprite,因为不是所有的sprite都可以进入,我正在使用相机左右平移。

我希望用户单击键盘键(左或右)或方向按钮sprite来连续平移相机直到用户释放控件。

我已经实现了与此示例类似的键盘平移,我按住一个键,相机移动/平移(在事件的每一侧各 10 个像素)并在按键释放时停止。

但是,当我尝试使用 2 个sprite按钮实现相同的功能时,每个按钮仅触发 1 个事件,并且每次点击仅平移相机 10 个像素。我需要一直开火,直到我放开钥匙。

1
2
3
4
5
6
7
8
var panRightButton = game.add.button(800, 5, 'right_pan_btn', onClickAction, this);
    panRightButton.onInputOver.add(onButtonOver, this);
    panRightButton.onInputOut.add(onButtonOut, this);
    panRightButton.onInputDown.add(panScreenRight, this);

    function panScreenRight() {
        game.camera.x += 10;
    }

我尝试过使用布尔标志 (isPanning),如果我单击按钮,该标志将变为真,而在释放时变为假。并在 game.camera.x += 10; 上有一个 while 循环,但它只是减慢并停止了脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function onClickAction() {
     isPanning = true;
}

function onButtonOut() {
      isPanning = false;
}

function onButtonUp() {
      isPanning = false;
}

function panScreenLeft() {
    if (isPanning) {
         game.camera.x -= 10;
    }
}


正确的方法是在 update 方法上,而不是在循环中。使用标志来知道按钮是否被按下是可以的,但只需让 Phaser 更新相机位置,就像在您链接的示例中一样:

1
2
3
4
5
6
7
8
9
10
11
12
function update() {

    //...

    if (isPanningLeft) {
        game.camera.x -= 10;
    } else if (isPanningRight) {
        game.camera.x += 10;
    }

   //...
}

您不需要循环,因为 update 方法是在循环中执行的(并且预计会逐帧执行一次)