Phaser arcade physics,使用重叠仅切换一次但持续发射

Phaser arcade physics, use overlap to switch only once but keeps firing

我正在使用 Phaser 框架开发一款动作游戏,我希望玩家能够触摸某些开关图块来关闭和重新打开其他敌人。所以它应该像这样工作:

  1. 玩家重叠了一个特殊的开关方块
  2. 执行切换动作,只执行一次
  3. 忽略进一步的重叠,直到玩家离开方块
  4. 当玩家离开开关板块时,它才应该再次开始检查重叠
  5. 当玩家再次重叠(或另一个切换方块)时从第 1 步开始重复

我正在使用街机物理并且重叠功能正在运行。但问题是重叠不断重复触发,就像每一帧一样。在 Phaser 中获得所需结果的最佳方法是什么?

请参阅下面的屏幕截图了解我的意思,我在这里创建了我的代码示例的 sandox: https://phaser.io/sandbox/edit/zEVOQfgA

您的代码无法正常工作,因为您将每个 update 上的 okoverlap 重置为 0。您需要做的是将 okoverlap 设置为一个状态,并在适当的时候更改该状态。

我通过将 属性 保存在 create 中的 game 对象中修复了你的代码。

game.flags = {};
game.flags.okoverlap = 0;

然后在 update 函数中我检查了 属性 和当前的重叠状态。

function update() {
    if(game.flags.okoverlap === 1 && !checkOverlap(mushroom, theswitch)) {
        game.flags.okoverlap = 0;
    }
    game.physics.arcade.overlap(mushroom, theswitch, handleCollide, null, this);
}

function checkOverlap(spriteA, spriteB) {
    var boundsA = spriteA.getBounds();
    var boundsB = spriteB.getBounds();

    return Phaser.Rectangle.intersects(boundsA, boundsB);
}

handleCollide函数里面的逻辑改为

if (game.flags.okoverlap != 1) {
    game.flags.okoverlap = 1;
    doSwitch();
}

最后将render中的okoverlap替换为game.flags.okoverlap以防止ReferenceError

game.debug.text('overlap: ' + (game.flags.okoverlap == 1 ? 'YES': (game.flags.okoverlap == -1 ? 'partial': 'no')), 20, 40);

此处为工作示例 - https://phaser.io/sandbox/edit/ikJBIznv

我一直在尝试更多并找到了一个解决方案,使用 2 个全局变量。一个变量 frameoverlap 用于检查是否存在重叠,一个变量 doswitch 用于查看切换操作是否已经完成。然后你可以在 update() 函数中处理它。

function update() {
    // assume no overlap
    frameoverlap = 0;

    // do arcade.overlap
    game.physics.arcade.overlap(mushroom, theswitch, handleCollide, null, this);

    // check flags after arcade.overlap
    if (frameoverlap == 1) {
        if (doswitch == 0) {
            doswitch = 1; // remember the switch was done
            doSwitch();
        }
    } else {
        if (doswitch == 1) {
            doswitch = 0; // stepping off the switch tile
        }
    }
}

在此处查看更新的代码 https://phaser.io/sandbox/edit/VTenTwgh