1

私は、あなたが弾丸を発射する単純な円であり、そのマルチプレイヤーなどであるゲームに取り組んでいます。さて、私は境界を、通過しなければならない迷路タイプのもののようなものにしようとしています。次のような衝突検出を試みました。

public void checkCollisions(){
    Rectangle r1 = bo.getBounds();
    Rectangle d = p.getBounds();
    if (d.intersects(r1))
        border = true;
}

基本的に、border = true の場合、キャラクターの動きを止めます。これを行うと、2つの問題があります。

  1. 彼は止まらないだけで本当に遅くなります。
  2. 彼は国境を越えても本当に遅い状態のままです。

私はこのような境界線を使用します:

boolean border = false;

次に、ペイントメソッドでこれを述べます:

if (border)
        p.dx = 0;
        p.dy = 0;

p は Guy クラスを表します :P dx と dy の詳細:

public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();

if (key == KeyEvent.VK_A)
    dx = -2;

if (key == KeyEvent.VK_D)
    dx = 2;

if (key == KeyEvent.VK_W)
    dy = -2;

if (key == KeyEvent.VK_S)
    dy = 2;

keyReleased については、dx と dy の値を 0 に変更して、男の動きについても説明します。

public void move() {
x = x + dx;
y = y + dy;
}

これが機能しない理由を理解するのを手伝ってください。

4

2 に答える 2

1

OK、まだゲーム ロジックの完全な再構築が必要だと思いますが、何が起こっているのかを明らかにすることはできると思います。物事が起こっているさまざまな場所を見てみましょう。

  1. PAINT: Swing スレッドでは、paint()が呼び出されると、衝突があったかどうかを確認し、衝突があった場合は速度をゼロにします (if ブロックを修正すると仮定します)。
  2. KEY: Swing スレッドでは、キーが押されたときに、押されたキーに応じて速度を設定します。
  3. チェック: 未知の時点で、衝突をチェックし、衝突があったかどうかを記録します。
  4. MOVE: ある未知の時点で、「男の」位置を速度で更新します。

ここに問題があります。Java では、他のプログラムと同様に、キーを押しているときに複数のキー押下イベントが発生します。1 回目と 2 回目の間に短い遅延があり、その後急速に繰り返されます。ブラウザのテキスト ボックスで試してみると、同じ動作が発生します。

それで、それはあなたにどのように影響しますか?さて、あなたはおそらく次のようなシナリオに陥っています:

PAINT -> speed set to zero
KEY -> speed set back to -2
MOVE -> guy is moved -2
CHECK -> border = false
PAINT -> speed set to zero again

本当に、次のようなゲーム ループが得られるようにコードを再構築すると、次のようになります。

public void runGame() {
    while(true) {
        updateSpeeds();
        updatePositionFromSpeed();
        repaint();
    }
}

代わりupdateSpeeds()に、キーが下か上かを照会し、男性がその方向に移動できるかどうかを計算しupdatePositionFromSpeed()、男性の位置を更新します。次に、男の座標と座標のみpaint()に依存し、書き込みを行わず、速度について知る必要もありません。xy

于 2011-08-03T03:02:16.173 に答える
0

ここに非常に簡単な解決策があります。

これが私の疑似コードの一部です。

        if(player.getBounds().intersects(wall.getBounds())){
            //Go Back to prior position, regardless of direction coming from. Since the reverse velocity X and velocity Y directions are taken care off
            x -= velX;
            y -= velY;

            //Then Stop at that prior position to make next move
            velX = 0;
            velY = 0;
        }
于 2014-04-10T10:15:28.660 に答える