2012-04-02 2 views
-1

나는 탁구 게임을 만들고 싶습니다. 벽에 닿을 때까지 공을 움직이고 싶습니다. 벽에 닿으면 다른 방향으로 간다. 문제는 내가 게임을 시작할 때 공이 올바른 방향으로 가고 있지만 벽에 닿으면 볼 방향이 반대로 하나의 픽셀에 대해서만 이루어 지므로 공이 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

+5

아니요 아니요 :(사용자의 GUI에서 절대로 Thread.sleep (...)을 사용하지 말고 항상 'Timer' [javax.swing.Timer] (http : /docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)을 참조하십시오. 모든 도움을 받으려면이 스레드를 확인하십시오. [examples] (http://stackoverflow.com/questions/9849950/something- 이 Ball Thingy :-)의 layout-jbutton-showing-wrong-with-r)과 같은 잘못된 것입니다. 무엇보다 좋은 점은이 [멋진 예제] (http://stackoverflow.com/a/9852739/1057230) –

답변

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 (!backY) 
    setPosY(++y); 
else 
    setPosY(--y); 

을가는 것을 반복에 대해 그럼

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

을하지만 당신은 바로 다시 false로 설정합니다 다음이라고합니다. 귀하의 방법 외의

private boolean backX = false; //same for backY 

을 권해드립니다.

+0

+1, 실제로 좋은 포획을 위해, 내 의견은 내가 제안한 것에 대해 잘못되었다. :-), 그래서 그것을 삭제했다. –

+0

감사합니다. 내 문제였습니다. 고마워. – MTHeadss

관련 문제