javascript - Phaser,使按钮点击事件连续

标签 javascript phaser-framework

我正在使用 Phaser.js 创建一个 map (tileSprite) 并在上面放置一些 Sprite ,因为并非所有 Sprite 都能进入,我正在使用相机左右平移。

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

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

但是,当我尝试使用 2 个 Sprite 按钮实现相同的操作时,每个按钮仅触发 1 个事件,并且每次单击仅将相机平移 10 像素。我需要继续射击,直到松开 key 。

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;
    }

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

function onClickAction() {
     isPanning = true;
}

function onButtonOut() {
      isPanning = false;
}

function onButtonUp() {
      isPanning = false;
}

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

最佳答案

正确的方法是在 update 方法上执行此操作,但不在循环内。使用标志来了解按钮是否被按下是可以的,但只需让 Phaser 更新相机位置,就像您链接的示例一样:

function update() {

    //...

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

   //...
}

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

关于javascript - Phaser,使按钮点击事件连续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34000285/

相关文章:

javascript - 无法使用 jquery 禁用 anchor 标记...在 ajax call() 期间既不能使用 "disabled"也不能使用 e.preventDefault()

javascript - 删除数据 jQuery

javascript - canPlayType maybe 和 probably 输出之间的区别

javascript - 相位器抖动检测

audio - canvas - 动画和播放声音的可点击、可触摸的矩形

javascript - JS 文件放在哪里让 NodeJS 看到它们

phaser-framework - Phaser3 场景转换

javascript - 如何阻止 Sprite 大小更改停止 Phaser 中的碰撞检测?

android - 如何在 iOS 上使用 Cordova 进行应用内购买 (IAP)?

javascript - 如何通过使用 takeUntil 的多个条件来停止订阅