近期在写一个java小游戏,然后遇到了第一个问题,那就是移动的问题,原因是java的键盘监听事件是不监听之前按过的,比如:“当我按下S之后在按A,注意此时的S是长按的,当松开A时,那么这时的S是没有被监听到的”,为了解决这个问题,我的思路是开一个线程,让这个线程时刻运行着,时刻监听键盘输入,那么就能解决这个问题。
代码如下:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class test extends JFrame implements KeyListener, Runnable {
background back = new background();
private boolean down, up, right, left;
test() {
setSize(900,700);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(back);
addKeyListener(this);
}
public static void main(String[] args) {
test t = new test();
Thread t1 = new Thread(t);
t1.start();
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_S) {
down = true;
System.out.println("1");
}
if(e.getKeyCode() == KeyEvent.VK_D) {
right = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_S) {
down = false;
}
if(e.getKeyCode() == KeyEvent.VK_D)
right = false;
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
if(down)
back.setHeroxy(back.getHerox(), back.getHeroy()-30);//角色位移
if(right)
back.setHeroxy(back.getHerox()+30, back.getHeroy());
back.repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}