0

所以我的问题是,当我使用 if 语句来确定我是否击中怪物并存活或击中怪物并死亡时,我遇到了一个奇怪的声音问题(它会非常快地重复击中的声音)。使用经典的马里奥逻辑,如果我降落在顶部,我会活着,否则我会死。在我添加了两个不同的 if 语句之前,我没有遇到任何问题。如果您需要更多信息,请告诉我。我认为我的问题是我如何使用 if 语句。

private void checkGhostCollisions() {
    int len = ghosts.size();
    for (int i = 0; i < len; i++) {
        Ghost ghost = ghosts.get(i);
        if (hero.position.y < ghost.position.y) {
            if (OverlapTester.overlapRectangles(ghost.bounds, hero.bounds))
                hero.hitGhost();
                listener.hit();
        } else {
        if(hero.position.y > ghost.position.y) 
             if (OverlapTester.overlapRectangles(hero.bounds, ghost.bounds)) {
                 hero.hitGhostJump();
                 listener.jump();
            break;
            }
        }
    }
}
4

1 回答 1

9

我怀疑这是问题所在:

if (hero.position.y < ghost.position.y) {
    if (OverlapTester.overlapRectangles(ghost.bounds, hero.bounds))
        hero.hitGhost();
        listener.hit();
}

注意内部 语句缺少大括号if,这意味着如果满足第一个if条件,listener.hit()始终调用。我怀疑你的意思是:

if (hero.position.y < ghost.position.y) {
    if (OverlapTester.overlapRectangles(ghost.bounds, hero.bounds)) {
        hero.hitGhost();
        listener.hit();
    }
}

从中吸取两个教训:

  • 始终正确缩进您的代码,如果您感到困惑,请让您的 IDE 为您缩进。
  • 如果你总是使用带有if块的大括号,它会减少这种事情发生的机会。

编辑:请注意,if每种情况下的内部条件是相同的,这意味着您可以将此代码简化为:

if (OverlapTester.overlapRectangles(hero.bounds, ghost.bounds)) {
    if (hero.position.y < ghost.position.y) {
        hero.hitGhost();
        listener.hit();
    } else {
        hero.hitGhostJump();
        listener.jump();
        break;
    }
}

请注意,这确实会稍微改变与hero.position.y完全相同的情况ghost.position.y- 您应该考虑在这种情况下您想要发生的事情。

于 2012-06-11T17:49:58.143 回答