首先解釋一下鍵盤出現延遲的原因:
其實鍵盤為了用戶體驗,在按下一次按鍵之后,會有片刻的延遲,為什么會這樣呢?
你想一下,當你打一個字母時,連著出來了好幾個字母,你心里面的感受是怎么樣的?
所以嘛,鍵盤還是很人性化的。
知道問題所在,那就說解決辦法吧,用boolean就可以解決這個問題,
比如剛開始設置一個UP = false;
當UP = true時,讓物體運動;
當按下上鍵時,把UP = true;
當松下上鍵時,把UP = false;
這樣的話延遲豈不是解決了,只要你不松上鍵,UP 就一直為true,物體就一直運動;
寫了個小例子,可以控制物體的八個方向的運動:
import java.awt.Color;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import javax.swing.JFrame;import javax.swing.JPanel;public class MyGame extends JPanel{ JFrame frame; int x = 10; int y = 10; int width = 50; int height = 50; int step = 5; boolean U=false,D=false,L=false,R=false; MyGame(){ frame = new JFrame(); frame.setSize( 800, 600); frame.setLayout(null); this.setLayout(null); this.setBackground(Color.blue); this.setBounds(0, 0, 800, 600); this.setFocusable(true); this.addKeyListener(new Mykey()); frame.add(this); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new MyGame(); } public void paint(Graphics g){ super.paint(g); g.setColor(Color.YELLOW); g.fillOval(x, y, width, height); repaint(); run(); try { Thread.sleep(20); } catch (InterruptedException e) { // TODO 自動生成的 catch 塊 e.PRintStackTrace(); } } public void run(){ if(!U&&!D&&L&&!R){ x-=step; }else if(!U&&!D&&!L&&R){ x+=step; }else if(U&&!D&&!L&&!R){ y-=step; }else if(!U&&D&&!L&&!R){ y+=step; }else if(U&&!D&&L&&!R){ x-=step; y-=step; }else if(!U&&D&&L&&!R){ x-=step; y+=step; }else if(U&&!D&&!L&&R){ x+=step; y-=step; }else if(!U&&D&&!L&&R){ x+=step; y+=step; } } class Mykey extends KeyAdapter{ @Override public void keyTyped(KeyEvent e) { // TODO 自動生成的方法存根 } @Override public void keyPressed(KeyEvent e) { // TODO 自動生成的方法存根 switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: L=true; break; case KeyEvent.VK_RIGHT: R=true; break; case KeyEvent.VK_UP: U=true; break; case KeyEvent.VK_DOWN: D=true; break; } if(x<=0) L = false; else if(x>=700) R = false; if(y<=0) U = false; else if(y>=490) D = false; } @Override public void keyReleased(KeyEvent e) { // TODO 自動生成的方法存根 switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: L=false; break; case KeyEvent.VK_RIGHT: R=false; break; case KeyEvent.VK_UP: U=false; break; case KeyEvent.VK_DOWN: D=false; break; } } }}如果遇到閃爍現象,請看http://blog.csdn.net/sangjinchao/article/details/53052897共勉~
新聞熱點
疑難解答