【问题标题】:Phaser arcade physics, use overlap to switch only once but keeps firingPhaser 街机物理,使用重叠只切换一次,但一直开火
【发布时间】:2018-04-15 01:45:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript game-physics phaser-framework


    【解决方案1】:

    您的代码不起作用,因为您将每个update 上的okoverlap 重置为0。您需要做的是将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();
    }
    

    最后将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

    【讨论】:

    • 感谢您的回复。但是这个解决方案使用两个独立的函数来做同样的重叠检查,自定义的checkOverlap 函数以及arcade.overlap 函数,这似乎是多余的。另外,我想在一个关卡中使用多个开关图块,因此这种解决方案不切实际。
    • @BdR 我专注于修复您的错误,而不是寻找最高效的解决方案。
    【解决方案2】:

    我一直在玩,并找到了一个解决方案,使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多