我正在使用Phaser框架制作动作游戏,我希望玩家能够触摸某些开关牌以关闭其他敌人并重新开启。所以它应该像这样工作:
我正在使用街机物理,重叠功能正在运行。但问题是重叠会一直反复发射,就像每一帧一样。 Phaser获得理想结果的最佳方式是什么?
请参阅下面的截图我的意思,我在这里创建了一个代码示例的sandox: https://phaser.io/sandbox/edit/zEVOQfgA
答案 0 :(得分:1)
您的代码无效,因为您要在okoverlap
上重置0
至update
。您需要做的是将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