Phaser arcade physics,使用重叠仅切换一次但持续发射
Phaser arcade physics, use overlap to switch only once but keeps firing
我正在使用 Phaser 框架开发一款动作游戏,我希望玩家能够触摸某些开关图块来关闭和重新打开其他敌人。所以它应该像这样工作:
- 玩家重叠了一个特殊的开关方块
- 执行切换动作,只执行一次
- 忽略进一步的重叠,直到玩家离开方块
- 当玩家离开开关板块时,它才应该再次开始检查重叠
- 当玩家再次重叠(或另一个切换方块)时从第 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
我正在使用 Phaser 框架开发一款动作游戏,我希望玩家能够触摸某些开关图块来关闭和重新打开其他敌人。所以它应该像这样工作:
- 玩家重叠了一个特殊的开关方块
- 执行切换动作,只执行一次
- 忽略进一步的重叠,直到玩家离开方块
- 当玩家离开开关板块时,它才应该再次开始检查重叠
- 当玩家再次重叠(或另一个切换方块)时从第 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