0

したがって、私の問題は、if ステートメントを使用して、モンスターにぶつかって生きているか、モンスターにぶつかって死んだかを判断するときに、奇妙な音の問題が発生することです (ヒット音が非常に速く繰り返されます)。古典的なマリオ ロジックを使用して、上に着地した場合は生き、そうでない場合は死ぬ。2 つの異なる 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();
    }
}

これから学ぶべき2つの教訓:

  • コードは常に適切にインデントし、混乱した場合は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 に答える