2017-09-06 30 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/をお読みください。ペイントではなくpaintComponentをオーバーライドする必要があり、そのメソッドの実装では、何か他の処理を行う前にsuper.paintComponentを呼び出す必要があります。 – VGR

答えて

2

これが機能していない理由は、あなたのペイント()の実装はすなわち、あなたは緑色のバーを複数回描画され、バックグラウンドをクリアしていないということです。したがって、棒が動く代わりに伸びているように見えます。

あなたはpaint(Graphics)メソッドをオーバーライドし、代わりにpaintComponent(Graphics)方法、そしてあなたが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を確認してください。

最後に、キー入力に応答して再描画することでゲームループを実装する方法は最適ではありません。あなたのゲームループは入力に依存せず、一定の間隔でシーンを更新する必要があります。入力イベントはゲームの状態を変更する必要がありますこれは次のシーン更新に反映されるべきである)。