2013-05-09 146 views
0

我想写一个2D图形游戏。在这个游戏中,我有键盘输入来移动黑色平面上的方块。我为了确保我想要使用缓冲键输入的平滑键运动。为了做到这一点,我使用一个布尔数组来保存击键。缓冲键盘输入

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.Timer; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Main extends JFrame{ 

/** 
* @param args 
*/ 
class Entity 
{ 
    int x = 150,y = 150; 
    int Speed = 5; 

} 

Entity user = new Entity(); 
boolean[] keys = new boolean[KeyEvent.KEY_TYPED]; 

public Main() 
{ 
    setSize(800,600); 
    setLocationRelativeTo(null); 

    final JPanel display = new JPanel() 
    { 
     protected void paintComponent(Graphics g) 
     { 

      g.setColor(Color.black); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
      g.setColor(Color.RED); 
      g.fillRect(user.x, user.y, 30, 30); 
     } 
    }; 


    addKeyListener(new KeyAdapter() 
    { 

     public void keyPressed(KeyEvent arg0) 
     { 

      keys[arg0.getKeyCode()] = true; 

      if(keys[KeyEvent.VK_UP]) 
      { 
       user.y -= user.Speed; 

      } 
      if(keys[KeyEvent.VK_DOWN]) 
      { 
       user.y += user.Speed; 
      } 
      if(keys[KeyEvent.VK_LEFT]) 
      { 
       user.x -= user.Speed; 
      } 
      if(keys[KeyEvent.VK_RIGHT]) 
      { 
       user.x += user.Speed; 

      } 

      setFocusable(true); 
      repaint(); 

     } 
    }); 


    //add a action listener 
    //remember to set the focusable 


    add(display); 
} 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 


    Thread t = new Thread(); 
    try { 
     t.sleep(100); 
     Main m = new Main(); 
     m.setVisible(true); 
     m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

} 

在此输入中,块以正确的方向移动但仅移动两次,然后以不同的移动移动,甚至停止移动。

我已经在我所有的Java书籍中搜索过,并且它没有什么帮助。我怎样才能解决这个错误?

+0

什么时候的Java成为 '低级别'?或者你是在躺着写吗? – 2013-05-09 08:48:26

回答

1

使boolean[] keys为局部变量,以便它不包含先前按下的键,这将影响x,y坐标。

public void keyPressed(KeyEvent arg0) 
{ 
    boolean[] keys = new boolean[KeyEvent.KEY_TYPED]; 
    keys[arg0.getKeyCode()] = true; 

    if(keys[KeyEvent.VK_UP]) 
    { 
     user.y -= user.Speed; 
    } 
    else if(keys[KeyEvent.VK_DOWN]) 
    { 
     user.y += user.Speed; 
    } 
    else if(keys[KeyEvent.VK_LEFT]) 
    { 
     user.x -= user.Speed; 
    } 
    else if(keys[KeyEvent.VK_RIGHT]) 
    { 
     user.x += user.Speed; 

    } 

    setFocusable(true); 
    repaint(); 
} 

如果你只是想清除键

public void keyPressed(KeyEvent arg0) 
{ 
     keys = new boolean[KeyEvent.KEY_TYPED]; 
     keys[arg0.getKeyCode()] = true; 
     /* Rest of code */ 
+0

有没有办法清除以前按下的按键? – Jonathan 2013-05-09 09:03:33

+1

@Tom看到更新 – 2013-05-09 09:12:25