Phaser街机物理,使用重叠只切换一次但保持射击

时间:2017-11-02 13:46:29

标签: javascript game-physics phaser-framework

我正在使用Phaser框架制作动作游戏,我希望玩家能够触摸某些开关牌以关闭其他敌人并重新开启。所以它应该像这样工作:

  1. 播放器与特殊切换磁贴重叠
  2. 执行切换操作仅一次
  3. 忽略进一步重叠,直到玩家离开拼贴
  4. 当玩家离开开关牌时,只有这样才开始检查重叠
  5. 当玩家再次重叠(或另一个切换牌)时,从步骤1开始重复
  6. 我正在使用街机物理,重叠功能正在运行。但问题是重叠会一直反复发射,就像每一帧一样。 Phaser获得理想结果的最佳方式是什么?

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

    enter image description here

2 个答案:

答案 0 :(得分:1)

您的代码无效,因为您要在okoverlap上重置0update。您需要做的是将okoverlap设置为状态并在适当的时间更改该状态。

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

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

最后使用okoverlap替换render中的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

答案 1 :(得分:-1)

我已经玩了一些,并使用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