-1

私が作っているゲームでは、ゾンビがお互いやプレイヤーを通り抜けられないようにしたいと思っています。

ゾンビ同士がぶつかったときにゾンビがしばらく止まったり、別の方向に移動したりするのは奇妙に見えるので、ゾンビが常にプレイヤーに追従するようにしたいです。私が考えていたのは、以前にゾンビの x と y の位置を追跡し (これは既に行っています)、別のゾンビまたはプレイヤーと衝突すると、別のゾンビと衝突する前の最後の x と y の位置にテレポートすることでした。スプライト。

これは機能しますか?それを行うより良い方法はありますか?また、ゾンビが別のスプライトと衝突する前に、最新の x と y の位置を追跡するにはどうすればよいでしょうか?

私はすでにゾンビの衝突をチェックするコードを持っています

for(int i = 0; i < zombies.size(); i++){
            Zombie z = (Zombie) zombies.get(i);
            Rectangle r2 = z.getBounds();
            for(int j = i + 1; j < zombies.size(); j++){
                Zombie z2 = (Zombie) zombies.get(j);
                Rectangle r1 = z2.getBounds();
                if(r2.intersects(r1)){
                    //the code for stoping the sprites from going through each other should be here
                }
            }
        }

スプライトが互いに通過しないようにするために、ifステートメントに何を入れるべきか疑問に思っています。

4

2 に答える 2

1

おそらく、衝突チェックと移動を同時に行う必要があります。

for(int i = 0; i < zombies.size(); i++){
    Zombie z = (Zombie) zombies.get(i);

    // New code here:
    int x = z.getX();
    int y = z.getY();
    attemptZombieMove(z);

    Rectangle r2 = z.getBounds();
    for(int j = 0; j < zombies.size(); j++){
        if (i == j) {
            continue;
        }
        Zombie z2 = (Zombie) zombies.get(j);
        Rectangle r1 = z2.getBounds();
        if(r2.intersects(r1)){
            //the code for stoping the sprites from going through each other should be here
        }
    }
}

内側のforループjを 0 から開始するように変更したことに注意してください。これを行ったのは、ループの途中でゾンビの位置を変更したいからです。したがって、ゾンビ A の衝突をチェックすると、ゾンビ B と衝突しない可能性がありますが、B が移動した後に衝突する可能性があります。

衝突検出によりz、sx と y の値が、int移動を試みる前に取得した sにリセットされる可能性がありますz。ただし、それよりも洗練されたものにすることができます-xに衝突がある場合はxをリセットし、yに衝突がある場合はyをリセットします(両方に衝突がある場合は両方をリセットします)。そうすれば、ゾンビは別のゾンビや壁などにぶつかり、それに沿って歩くことができます.

1 つの提案は、各ゾンビが各ティックで 1 ピクセルだけ移動するように、ティックを十分に短くすることです。そうすれば、ゾンビが動かないようにしても、そこまで後退することはありません。ゾンビが全速力でプレイヤーに向かうには、ゾンビ間に 1 ピクセルのギャップがあれば十分です。これを 1 ピクセル小さいコリジョン ボックスと組み合わせると、ゾンビが移動しているときに目的の密度のゾンビが得られるはずです。

また、クラスをZombie拡張し、すべてのゾンビを含む のCollidableObjectコレクションを内側のループで反復処理することもできます。CollidableObjectそうすれば、Wallクラス、Obstacleクラスなどを作成し、それらをすべて extends してCollidableObject、より多くのオブジェクトをリストに貼り付けることができCollidableObject、ゾンビや障害物との衝突はすべて 1 つのループで処理されます。

于 2013-04-25T18:56:00.740 に答える