2014-11-08 82 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