2017-09-06 23 views
1

JFrame에서 왼쪽 또는 오른쪽으로 사각형을 이동하려고합니다. 그러나 화살표 버튼을 사용하면 막대가 움직이지 않습니다. 그것은 단지 연장입니다. 직사각형은 Brick Breaker 유형의 게임을위한 것입니다. 이미 그린 영역을 유지 -JFrame의 이동 문제

public class main 
{ 

    public static void main(String[] args) 
    { 

    JFrame obj = new JFrame("Brick Breacker"); 
    obj.setBounds(50,50,1200,900); 
    obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    obj.setVisible(true);  
    Grafica grafica = new Grafica(); 
    obj.add(grafica); 
    } 
} 

public class Grafica extends JPanel implements ActionListener , KeyListener 
{ 
    Timer tm = new Timer(0,this); 
    boolean play = false; 
    int playerX = 550; 
    int playerXs = 0; 

    public Grafica() 
    { 
    tm.start(); 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false);  
    } 

    public void paint (Graphics g) 
    {     
    //paddle 
    g.setColor(Color.GREEN); 
    g.fillRect(playerX, 800, 145, 10); 

    //borders 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, 5, 900); 
    g.fillRect(1180, 0, 5, 900); 
    g.fillRect(1200, 0, -1200, 5); 
    g.setColor(Color.RED); 
    g.fillRect(1200, 860, -1200, 5); 

    //ball 
    g.setColor(Color.blue);   
    g.fillOval(550,700, 26, 26); 
    } 

    public void actionPerformed(ActionEvent e) 
    {  
    playerX = playerX + playerXs; 
    repaint(); 
    } 

    public void keyTyped(KeyEvent e) 
    {     
    } 

    public void keyReleased(KeyEvent e) 
    { 
    playerXs = 0;  
    } 

    public void keyPressed(KeyEvent e) 
    { 
    int c = e.getKeyCode(); 
    if(c == KeyEvent.VK_RIGHT) 
    { 
     if(playerX > 850) 
     { 
      playerX = 850; 
     } else 
     { 
      moveRight(); 
     } 

    } 

    if(c == KeyEvent.VK_LEFT) 
    { 
     if(playerX > 850) 
     { 
      playerX = 850; 
     } else 
     { 
      moveLeft(); 
     } 
    } 
    } 

    public void moveRight() 
    { 
    play = true; 
    playerX+=20; 

    } 

    public void moveLeft() 
    { 
    play = true; 
    playerX-=20; 

    } 
} 
+2

https://docs.oracle.com/javase/tutorial/uiswing/painting/을 읽으십시오. paint는 아니고 paintComponent를 오버 라이드 (override) 할 필요가있어, 그 메소드의 구현은, 아무것도 실시하기 전에 super.paintComponent를 호출 할 필요가 있습니다. – VGR

답변

2

이 작동하지 않는 이유는 페인트() 구현 즉 당신이 녹색 막대를 여러 번 그리는, 배경을 삭제하지 않습니다. 막대가 움직이기보다는 늘어나는 것처럼 보입니다.

당신은 paint(Graphics) 방법, 대신 paintComponent(Graphics) 메소드를 오버라이드 (override)하지 않습니다, 당신은 super.paintComponent(Graphics)를 호출해야합니다

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    // Now do your own painting here... 
} 

슈퍼 클래스 구현에 대한 호출 당신을 포함하여 그래픽 컨텍스트의 초기화를 줄 것이다 JPanel의 배경색으로 지 웁니다.

custom painting in Swing components here하는 방법에 대해 자세히 알아볼 수 있습니다.

또한 쪽지로 오른쪽의 범위 제한이 적용되지 않지만 왼쪽의 것은 제한적이 아닙니다. playerX < 0을 확인해야합니다.

마지막으로 게임 루프를 구현하는 방법 (키 입력에 응답하고 다시 그리기)이 최적이 아닙니다. 구글이 '자바 게임 루프'를 통해 더 나은 방법으로 아이디어를 얻는다. (게임 루프는 입력에 독립적이어야하며 일정한 간격으로 장면을 업데이트해야한다.) 입력 이벤트는 게임 상태를 변경해야한다. , 다음 장면 업데이트에 반영되어야 함).