2014-11-08 81 views
0

我現在正在用Java教授自己的2D圖形。我正在嘗試創建一個塊堆疊遊戲。到目前爲止,我能夠獲得第一排的移動和停止,但我的目標是在第一排以下產生一個新排,而第一排保留原位。我感覺像修復這是一個簡單的概念,我還沒有學到。但是,任何意見將不勝感激。如果你想指向正確的方向,我可以自學2D圖形,但我也會欣賞它。Java圖形2D和KeyListener

我對JFrame代碼如下:

public class BlockStacker extends JFrame { 
public class AL extends KeyAdapter { 
    stack2 s2 = new stack2(); 
    public void keyPressed(KeyEvent e){ 
     int keyCode = e.getKeyCode(); 
    } 

} 
public static void main(String[] args){ 
    stack2 s = new stack2(); 
    JFrame f = new JFrame(); 
    f.add(s); 
    f.setVisible(true); 
    f.setSize(1920, 1080); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setTitle("Block Stacker"); 


} 

} 

與圖形和KeyListener的代碼是這樣的:

public class stack2 extends JPanel implements ActionListener, KeyListener{ 
    Timer t = new Timer(250, this); 
    double x, y, velX = 253; 


    public stack2() { 
     t.start(); 
     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 

    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 

     setBackground(Color.BLACK); 
     Color blue = new Color(0,0,255); 
     g2.setColor(blue); 

     Rectangle2D.Double rectangle = new Rectangle.Double(x + 210, y, 200, 100); 
     g2.fill(rectangle); 

     Rectangle2D.Double rectangle2 = new Rectangle.Double(x, y, 200, 100); 
     g2.fill(rectangle2); 

     Rectangle2D.Double rectangle3 = new Rectangle.Double(x + 420, y, 200, 100); 
     g2.fill(rectangle3); 

    } 

    public void actionPerformed(ActionEvent e) { 
     if (x < 0) { 
      velX = -velX; 
     } 

     x += velX; 
     repaint(); 

     if (x < 10 || x > 1200) { 
      velX = -velX; 
      repaint(); 
     } 
    } 

    public void space() { 
     velX = 0; 
     repaint(); 

    } 
public void space2() { 


    } 


public void keyPressed(KeyEvent e) { 
    int code = e.getKeyCode(); 
    if (code == KeyEvent.VK_SPACE) { 
     space(); 
      } 
}  

public void keyTyped(KeyEvent e) {} 
public void keyReleased(KeyEvent e) { 
int code = e.getKeyCode(); 
    if (code == KeyEvent.VK_SPACE) { 
     space2(); 
    } 
} 

} 
+0

請使用鍵綁定嗎?請參閱[如何使用鍵綁定](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer 2014-11-08 20:28:19

回答

0

有多種問題...

  1. 您將KeyListener附加到JFrame,但JFrame具有JRootPane,內容窗格,並且它是它與用戶之間的內容,任何這些組件可能有鍵盤焦點,防止幀接收關鍵事件
  2. 您在KeyAdapter和框架中都創建了堆棧實例,因此您嘗試更改的堆棧實例不是屏幕上的版本
  3. 的KeyListener只響應關鍵事件時,他們被臨時用戶到是焦點能夠與具有焦點的組件...

使用鍵綁定呢?請參閱How to use key bindings

+0

謝謝您的回答。我會考慮自學教學的關鍵約束力。 – 2014-11-10 18:14:19