2012-12-07 123 views
0

我正在嘗試做一個Java乒乓球遊戲。我對Java很少有經驗,需要一些幫助。我在網上閱讀了很多東西,下面是我提出的代碼。 我創建了以下類,但我得到的只是灰色屏幕。我只是試圖爲此實現最簡單的解決方案。任何人都可以指出這個代碼有什麼問題嗎?謝謝。嘗試Java乒乓球

package pong_test_1; 

    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.event.KeyEvent; 
    import java.awt.event.KeyListener; 

    /** 
    * 
    * @author jtrinidad 
    */ 

    public class main_class extends JFrame implements KeyListener{ 
     static final int FRAME_WIDTH = 800; 
     static final int FRAME_HEIGHT = 500; 
     JFrame f; 

     public main_class() 
     { 
      super(); 
      addKeyListener (this); 
      setFocusable (true); 

      f = new JFrame("Pong"); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      f.setResizable(false); 

      f.setSize(FRAME_WIDTH,FRAME_HEIGHT); 
      f.setVisible(true); 

     } 

     @Override 
     public void keyTyped(KeyEvent e) { 
     } 
     @Override 
     public void keyPressed(KeyEvent e) { 
      Pong_Test_1 p = new Pong_Test_1(); 
      int keyCode = e.getKeyCode(); 
      switch(keyCode) { 
       case KeyEvent.VK_UP: 
        Pong_Test_1.p2_pos_y--; 
        break; 
       case KeyEvent.VK_DOWN: 
        Pong_Test_1.p2_pos_y++; 
        break; 
       case KeyEvent.VK_Q: 
        Pong_Test_1.p1_pos_y++; 
        break; 
       case KeyEvent.VK_A : 
        Pong_Test_1.p1_pos_y++; 
        break; 
      } 
      add(p); 
      repaint(); 
     } 

     /** Handle the key released event from the text field. */ 
     @Override 
     public void keyReleased(KeyEvent e) { 

     } 

     public static void main(String[] args) { 
      // TODO code application logic here 
      main_class c = new main_class(); 
     } 


    } 

/* 
    * To change this template, choose Tools | Templates 
    * and open the template in the editor. 
    */ 
    package pong_test_1; 

    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 



    /** 
    * 
    * @author jtrinidad 
    */ 
    public class Pong_Test_1 extends JPanel implements ActionListener{ 

     /** 
     * @param args the command line arguments 
     */ 
     //Sizes of each object 
     static final int WIDTH = 10; 
     static final int HEIGHT = 120; 
     static final int RADIUS = 10; 
     //Position of Player 1's paddle 
     static int p1_pos_x = 10; 
     static int p1_pos_y = main_class.FRAME_HEIGHT/2; 
     //Position of Player 2's paddle 
     static int p2_pos_x = main_class.FRAME_WIDTH - 20; 
     static int p2_pos_y = main_class.FRAME_HEIGHT/2;; 
     //Position of the ball 
     static int ball_pos_x; 
     static int ball_pos_y; 


     Timer animator; 

     public Pong_Test_1() 
     { 
      animator = new Timer (10, this); 
      animator.start(); 
     } 


     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      this.setBackground(Color.BLACK); //Sets background color 

      g.setColor(Color.WHITE); 
      g.fillRect(p1_pos_x, p1_pos_y, WIDTH, HEIGHT); 
      g.fillRect(p2_pos_x, p2_pos_y, WIDTH, HEIGHT); 
      g.fillOval(100, 100, RADIUS, RADIUS); 
     } 

     public void actionPerformed(ActionEvent e) { 
      repaint(); 
      revalidate(); // new line 
     } 

     private void addKeyListener(Pong_Test_1 aThis) { 
      throw new UnsupportedOperationException("Not yet implemented"); 
     } 


    } 
+0

從基礎開始。你知道如何着色屏幕嗎?在這裏,你可以提出具體的問題,但檢查整個來源不是我們的工作。 – Jimmt

+1

另外,你應該遵循命名約定;在類/方法名稱中沒有下劃線,並且將每個單詞的首字母大寫爲類名稱。 – Jimmt

+0

在你的'actionPerformed()'方法中調用'repaint();'不會像你認爲的那樣調用'paintComponent()'。 –

回答

4

看是否有此SSCCE工作更您的期望,主要的問題是既延伸並且具有JFrame的一個實例。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class main_class implements KeyListener { 

    static final int FRAME_WIDTH = 800; 
    static final int FRAME_HEIGHT = 500; 
    JFrame f; 

    public main_class() { 
     f = new JFrame("Pong"); 

     JPanel gui = new JPanel(); 
     gui.setFocusable(true); 
     gui.addKeyListener(this); 
     f.setContentPane(gui); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.setResizable(false); 

     f.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     f.setVisible(true); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     // this will steal the focus for KeyEvents, or rather.. 
     // Pong_Test_1 p = new Pong_Test_1(); 
     int keyCode = e.getKeyCode(); 
     System.out.println(e); 
     switch (keyCode) { 
      case KeyEvent.VK_UP: 
       Pong_Test_1.p2_pos_y--; 
       break; 
      case KeyEvent.VK_DOWN: 
       Pong_Test_1.p2_pos_y++; 
       break; 
      case KeyEvent.VK_Q: 
       Pong_Test_1.p1_pos_y++; 
       break; 
      case KeyEvent.VK_A: 
       Pong_Test_1.p1_pos_y++; 
       break; 
     } 
     // ..adding it will steal the content area & focus 
     //add(p); 
     f.repaint(); 
    } 

    /** 
    * Handle the key released event from the text field. 
    */ 
    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
     main_class c = new main_class(); 
    } 
} 

作爲一般性的建議:

  • 不要延長框架,只是一個參考保持一個。
  • 對於Swing,請使用密鑰綁定而不是KeyListener
+0

但是您的示例中沒有任何繪圖。 –

+1

@NikitaBeloglazov問題是*「任何人都可以指出這個代碼有什麼問題?」*(上面)是一個。還要注意,以'//開頭的註釋將會竊取KeyEvent的焦點,或者說是......「。SO不是代碼修復的'一流商店' - BNI。 –

+0

感謝您的回答。還有很多其他的東西需要修改,但最終產品效果很好! –

1
  1. 不要對你類main_class,用MainClassPongWindow代替 - >Java JLS
  2. main_class extends JFrame,所以這應該是JFrame的實例,不要」在你的構造函數中創建一個新的。
  3. Pong_Test_1中爲您的字段創建getter和setter。
  4. 閱讀更多關於OOP和Java的教程。

private final Pong_Test_1 myPong;  

public PongWindow() { 
    super(); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.addKeyListener(this); 
    this.setFocusable(true); 
    this.setResizable(false); 
    this.setSize(FRAME_WIDTH,FRAME_HEIGHT); 

    myPong = new Pong_Test_1(); 
    this.getContentPane().add(myPong); 

    this.setVisible(true); 
} 

而在你keyPressed()方法使用您的實例來操縱。

myPong.p2_pos_y--; 
+1

他在按鍵上添加了「Pong_test_1」的實例,所以你的'3。您要繪製的組件是您的JPanel,但您不要將它放在窗口中。「是錯誤的。 –

+0

*「您的main_class擴展JFrame,所以這應該是您必須實例化的類」* main_class不需要擴展框架。 –

+0

@NikitaBeloglazov THX的那個提示,改變了我的帖子 –