2016-08-22 7 views
0

私はかなりJavaに新しいですし、いくつかの助けを使用することができます。私はPongゲーム(Eclipseを使用して)を作成しました。そして、ほとんどの場合、それはかなりうまく機能します。しかし、何かが衝突検出で正しくない。ボールは人間がコントロールするパドルから跳ね返ってきますが、AI制御のパドルを常に通り抜けています。私の人生は自分のコードで何が間違っているのか理解できません。誰もがそれを見るために必要がある場合Java Pongのゲームの衝突検出の問題

package PongV2; 

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 


public class Tennis extends Applet implements Runnable, KeyListener{ 
final int WIDTH = 700, HEIGHT = 500; 
Thread thread; 
HumanPaddle p1; 
AIPaddle p2; 
Ball b1; 
boolean gameStarted; 
Graphics gfx; 
Image img; 


public void init(){ 
    this.resize(WIDTH, HEIGHT); 
    gameStarted = false; 
    this.addKeyListener(this); 
    p1 = new HumanPaddle(1); 
    b1 = new Ball(); 
    p2 = new AIPaddle(2, b1); 
    img = createImage(WIDTH, HEIGHT); 
    gfx = img.getGraphics(); 
    thread = new Thread(this); 
    thread.start(); 
} 

public void paint(Graphics g){ 
    gfx.setColor(Color.black); 
    gfx.fillRect(0, 0, WIDTH, HEIGHT); 
    if(b1.getX() < -10 || b1.getX() > 710){ 
     gfx.setColor(Color.red); 
     gfx.drawString("Game Over", 350, 250); 
    } 
    else{ 
    p1.draw(gfx); 
    b1.draw(gfx); 
    p2.draw(gfx); 
} 

    if(!gameStarted) { 
     gfx.setColor(Color.white); 
     gfx.drawString("Pong", 343, 100); 
     gfx.drawString("Press Enter to Begin...", 295, 130); 
    } 
    g.drawImage(img, 0, 0, this); 

} 


public void update(Graphics g){ 
    paint(g); 
} 

public void run() { 
    for(;;){ 
     if(gameStarted) { 
     p1.move(); 
     p2.move(); 
     b1.move(); 
     b1.checkPaddleCollision(p1, p2); 
     } 
     repaint(); 
     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode() == KeyEvent.VK_UP) { 
     p1.setUpAccel(true); 
    } else if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
     p1.setDownAccel(true); 
    } else if(e.getKeyCode() == KeyEvent.VK_ENTER){ 
     gameStarted = true; 

} 
} 
public void keyReleased(KeyEvent e) { 
    if(e.getKeyCode() == KeyEvent.VK_UP) { 
     p1.setUpAccel(false); 
    } else if(e.getKeyCode() == KeyEvent.VK_DOWN){ 
     p1.setDownAccel(false); 
    } 

} 


public void keyTyped(KeyEvent arg0) { 

} 

} 

、また "AIPaddle" クラスを見て:

メインクラス、 "テニス":ここでは、コードです

package PongV2; 

import java.awt.Color; 
import java.awt.Graphics; 

public class AIPaddle implements Paddle{ 
double y, yVel; 
boolean upAccel, downAccel; 
final double GRAVITY = 0.94; 
int player, x; 
Ball b1; 

public AIPaddle(int player, Ball b){ 
    upAccel = false; downAccel = false; 
    b1 = b; 
    y = 210; yVel = 0; 
    if(player == 1) 
     x = 20; 
    else 
     x = 660; 
} 

public void draw(Graphics g) { 
    g.setColor(Color.white); 
    g.fillRect(x, (int)y, 20, 80); 

} 

public void move() { 
    y = b1.getY() -40; 


    if(y < 0) 
     y = 0; 
    if(y > 420) 
     y = 420; 

} 


public int getY() { 
    return (int)y; 
} 

} 

"ボール"クラス:

package PongV2; 

import java.awt.Color; 
import java.awt.Graphics; 

public class Ball { 
double xVel, yVel, x, y; 

public Ball(){ 
    x = 350; 
    y = 250; 
    xVel = getRandomSpeed() * getRandomDirection(); 
    yVel = getRandomSpeed() * getRandomDirection(); 
} 

public double getRandomSpeed(){ 
    return(Math.random() *3 + 2); 
} 

public int getRandomDirection(){ 
    int rand = (int)(Math.random() * 2); 
    if(rand == 1) 
     return 1; 
    else 
     return -1; 
} 

public void draw(Graphics g){ 
    g.setColor(Color.white); 
    g.fillOval((int)x-10, (int)y-10, 20, 20); 
} 

public void checkPaddleCollision(Paddle p1, Paddle p2){ 
    if (x <= 50){ 
     if(y >= p1.getY() && y <= p1.getY() + 80){ 
      xVel = -xVel; 
} 
    else if(x >= 650){ 
     if(y >= p2.getY() && y <= p2.getY() + 80) 
      xVel = -xVel; 
    } 
    } 
} 

public void move(){ 
    x += xVel; 
    y += yVel; 

    if(y < 10) 
     yVel = -yVel; 
    if(y > 490) 
     yVel = -yVel; 
} 

public int getX(){ 
    return (int)x; 
} 

public int getY(){ 
    return (int)y; 
} 

} 

誰かが私のコードを修正する必要があるとアドバイスしてもらえますか?ありがとう。

+0

何らかのエラーがスローされますか? –

+0

いいえ、間違いはありません。それが始動し、すべてのものが、ボールはAIパドルを通過するだけで、衝突の検出はありません。しかし、それは人によって制御されたパドルからちょうど良い跳ね返ります。コードのどこにエラーがあるのか​​分からない。 – codeslayer93

+0

デバッガを使用してみてください。 –

答えて

1

checkPaddleCollisionMethodのif文です。あなたは今これを持っています。

if(...) { 
    if(...) { 
    } 
    else if(...) { 
     if(...) { 
     } 
    } 
} 

else ifは、最初のものではなく、2番目のものと平行です。あなたはもっとこのような構造を望んでいます。

if(...) { 
    if(...) { 
    } 
} 
else if(...) { 
    if(...) { 
    } 
} 
+0

すごい、うまくいった!ありがとうございました!私の間違いが常に中括弧の上にあるように見える、笑。 – codeslayer93

+0

それを聞いてうれしい。これはあなたの問題を解決したので、あなたはそれがより多くの答えを必要としないことを示すために受け入れられた/最良の答えとしてマークする必要があります。これは、上下のボタンの下にあるチェックマークボタンをクリックすることで実行されます。 – John