2011-08-03 16 views
1

私は、あなたが弾丸とそのマルチプレイヤーなどを発射する単純な円であるゲームに取り組んでいます。イメージを「境界」にする

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

そして、基本的に国境= trueの場合、私は動いてから文字を停止:まあ、私はuが私はこのような衝突検出を試みたが通過する必要があること、ソートの迷路型のもののような境界を作るしようとしています。私はこれを行うときに2つの問題があります。

  1. 本当に遅くなりません。
  2. 彼は国境からでも本当に遅い状態にとどまっています。

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

boolean border = false; 

はその後、私の塗装方法では、私はこれを述べる:

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

pはガイクラスを表す:DXとDYのP の詳細:

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 i just chang Eも男はどのように移動するかのために0 にDXとDYの値は:

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

私はこれが動作しない理由を把握助けてください。

+0

あなたは 'border'を使用する場所を表示できますか? –

+0

私はちょうどそれを編集しました。その真偽値ですが、それが偽であれば何も起こりませんが、それが真実であれば、私はその男が動くのを止めます。 –

+0

あなたはもっと見る必要があります。 checkCollisionsはパラメータを取り、ブール値を返しますか? –

答えて

1

OK、私はまだあなたのゲームロジックの完全な再構成が整っていると思っていますが、何が起こっているのかについてはわかります。衝突があった場合paint()が呼び出されSwingのスレッド、上で、あなたが見るので、ゼロ速度アウト(あなたがブロック場合、その修正と仮定した場合)の場合:

  1. PAINT:さんは、物事が起こっているさまざまな場所を見てみましょう。
  2. キー:スウィングスレッドで、キーを押すと、押されたキーに従って速度を設定します。
  3. CHECK:ある未知の点で、衝突をチェックし、衝突の有無を記録します。
  4. 移動:いくつかの不明な点で、あなたの「男の」位置を速度で更新します。

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の座標にとしか頼っておらず、それらに書き込むことはなく、速度について知る必要はありません。

+0

ありがとうございます!これは実際に助けられました! –

+0

@Michael:Markの答えがあなたを助けてくれたら、彼の答えを投票してください。それがあなたの質問を解決したか、または合理的な時間(例えば、1日か2日)で最高の答えである場合は、答えを受け入れてください。 –

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; 
     } 
関連する問題