2012-04-02 77 views
-1

我想创建一个Pong游戏。我想以某种方式移动球,直到碰到墙。如果它碰到墙壁,它会以另一种方式。问题是,当我开始玩球时,球沿着正确的方向运动,但是当球接触到墙壁时,球的方向反转,但只有一个像素,所以球反转1个像素,然后方向改变角度并且它接触墙再次。我的移动球的代码在initBall方法中。请帮我:(球不像我想要的

这里是我的playPanel类:

private int posX = SCREEN_WIDTH/2; 
private int posY; 

public Point posMouse = new Point(); 
private Point posBall = new Point(); 

private int playPanelWidth; 
private int playPanelHeight; 

private int padPanelWidth; 
private int padPanelHeight; 

private int panPanelWidth; 
private int panPanelHeight; 

private JLabel player1Score = new JLabel("0"); 
private JLabel ComputerScore = new JLabel("0"); 

private JPanel panPlayer1; 
public JPanel panComputer; 

public JPanel padPlayer1; 
public JPanel padComputer; 

private JButton but_Escape = new JButton("Press escape to continue !"); 

/* 
* Constructor 
*/ 
// ============================================== 
public PlayPanel() { 
    super(new BorderLayout()); 
    setBackground(PANPLAY_COLOR); 

    panPlayer1 = new JPanel(); 
    panComputer = new JPanel(); 

    padPlayer1 = new JPanel(); 
    padComputer = new JPanel(); 

    padPlayer1.setBackground(Color.DARK_GRAY); 
    padComputer.setBackground(Color.DARK_GRAY); 

    padPlayer1.setPreferredSize(PADPANEL_SIZE); 
    padComputer.setPreferredSize(PADPANEL_SIZE); 

    panPlayer1.setBackground(PANPLAY_COLOR); 
    panComputer.setBackground(PANPLAY_COLOR); 

    panPlayer1.add(padPlayer1); 
    panComputer.add(padComputer); 

    add(panPlayer1, BorderLayout.WEST); 
    add(panComputer, BorderLayout.EAST); 

    addMouseMotionListener(this); 

    panPlayer1.addComponentListener(new ComponentAdapter() { 

     @Override 
     public void componentResized(ComponentEvent arg0) { 
      setPanPanelWidth(arg0.getComponent().getSize().width); 
      setPanPanelHeight(arg0.getComponent().getSize().height); 
     } 

    }); 

    addComponentListener(new ComponentAdapter() { 

     @Override 
     public void componentResized(ComponentEvent arg0) { 

      setPlayPanelWidth(arg0.getComponent().getSize().width); 
      setPlayPanelHeight(arg0.getComponent().getSize().height); 
     } 

    }); 
} 

/* 
* Setters and Getters 
*/ 
// ============================================== 

public int getPosX() { 
    return posX; 
} 

public void setPosX(int posX) { 
    this.posX = posX; 
} 

public int getPosY() { 
    return posY; 
} 

public void setPosY(int posY) { 
    this.posY = posY; 
} 

public JPanel getPanPlayer1() { 
    return panPlayer1; 
} 

public void setPanPlayer1(JPanel panPlayer1) { 
    this.panPlayer1 = panPlayer1; 
} 

public JPanel getPanComputer() { 
    return panComputer; 
} 

public void setPanComputer(JPanel panComputer) { 
    this.panComputer = panComputer; 
} 

public int getPlayPanelHeight() { 
    return playPanelHeight; 
} 

public void setPlayPanelHeight(int playPanelHeight) { 
    this.playPanelHeight = playPanelHeight; 
} 

public int getPlayPanelWidth() { 
    return playPanelWidth; 
} 

public void setPlayPanelWidth(int playPanelWidth) { 
    this.playPanelWidth = playPanelWidth; 
} 

public int getPadPanelWidth() { 
    return padPanelWidth; 
} 

public void setPadPanelWidth(int padPanelWidth) { 
    this.padPanelWidth = padPanelWidth; 
} 

public int getPadPanelHeight() { 
    return padPanelHeight; 
} 

public void setPadPanelHeight(int padPanelHeight) { 
    this.padPanelHeight = padPanelHeight; 
} 

public int getPanPanelWidth() { 
    return panPanelWidth; 
} 

public void setPanPanelWidth(int panPanelWidth) { 
    this.panPanelWidth = panPanelWidth; 
} 

public int getPanPanelHeight() { 
    return panPanelHeight; 
} 

public void setPanPanelHeight(int panPanelHeight) { 
    this.panPanelHeight = panPanelHeight; 
} 

/* 
* Add the ball 
*/ 
// ============================================== 
public void paintComponent(Graphics g) { 

    super.paintComponent(g); 

    Graphics2D g2 = (Graphics2D) g; 

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setColor(Color.BLACK); 

    initBall(g2); 

    // trait épais 
    g2.setColor(Color.DARK_GRAY); 

    g2.setStroke(new BasicStroke(10)); 
    g2.drawLine((getPlayPanelWidth()/2) - 5, getPlayPanelHeight(), 
      (getPlayPanelWidth()/2) - 5, 0); 
} 

/* 
* Init ball 
*/ 
// ============================================== 
private void initBall(Graphics2D graphics2d) { 

    int x = getPosX(), y = getPosY(); 
    boolean backX = false; 
    boolean backY = false; 

    Graphics2D g2 = graphics2d; 

    g2.fillOval(posX, posY, BALL_WIDTH, BALL_HEIGHT); 

    //posBall.setLocation(posX + BALL_WIDTH, posY + (BALL_HEIGHT/2)); 

    if (x < 1) 
     backX = false; 
    if (x > getWidth() - 50) 
     backX = true; 

    if (y < 1) 
     backY = false; 
    if (y > getHeight() - 50) 
     backY = true; 


    if (!backX) 
     setPosX(++x); 

    else { 
     setPosX(--x); 
    } 

    if (!backY) 
     setPosY(++y); 
    else 
     setPosY(--y); 

    repaint(); 

    try { 
     Thread.sleep(2); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 

@Override 
public void mouseDragged(MouseEvent arg0) { 
} 

@Override 
public void mouseMoved(MouseEvent arg0) { 

    posMouse.setLocation(arg0.getX(), arg0.getY() 
      - (getPadPanelHeight()/2)); 

    padPlayer1.setLocation(getPanPanelWidth() - 15, (int) posMouse.getY()); 
    padComputer.setLocation(5, (int) posMouse.getY()); 
} 

}

+6

http://sscce.org/ – talnicolas 2012-04-02 16:28:14

+5

否否否:(永远不要在GUI中使用'Thread.sleep(...)',总是使用'Timer' [javax.swing.Timer](http:/ /docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)。为了更好的帮助检查这个线程的所有工作[示例](http://stackoverflow.com/questions/9849950/something-似乎是错误的与这个球Thingy :-)布局jbutton显示,意外,行为在r)。最好是检查这个[WONDERFUL示例](http://stackoverflow.com/a/9852739/1057230) – 2012-04-02 16:34:13

回答

3

所以,你必须:

private void initBall(Graphics2D graphics2d) { 

int x = getPosX(), y = getPosY(); 
boolean backX = false; 
boolean backY = false; 
在开始

,这样不管哪个方向球布尔布尔每次都被设置为false。然后,在设置后退选项时,您没有“Else”选项

if (x < 1) 
    backX = false; 
if (x > getWidth() - 50) 
    backX = true; 

if (y < 1) 
    backY = false; 
if (y > getHeight() - 50) 
    backY = true; 

发生的事情是,球正在朝着正确的方向移动,直到它撞到墙上(我在猜测顶壁)。那么这个被称为:

if (y > getHeight() - 50) 
    backY = true; 

那么接下来该次迭代球追溯到因为

if (!backY) 
    setPosY(++y); 
else 
    setPosY(--y); 

但随后将其重新设置为false的时候了。我建议你有

private boolean backX = false; //same for backY 

你的方法之外。

+0

+1,实际上对于漂亮的catch,我的评论是错误的,我的建议是:-),所以删除它。 – 2012-04-02 16:56:15

+0

感谢上帝,那是我的问题。非常感谢 – MTHeadss 2012-04-02 16:58:05