您的代码不起作用,因为您将每个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