在编写雷霆战机游戏的时候,发现按键会相互冲突,左右移动会有卡顿现象,后来参考了大量网页,想到一个解决思路,经测试可以运行.
1.给按键keyPressed 和keyRelease都设置一个标志位
2.按下按键将标志位设置为true
3.松开按键将标志位设置为false
4.在线程中执行具体移动事件
具体演示源代码如下
package s0218按键不冲突;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main1214 extends JFrame
{ static int x=50;
static int y=50;
static int speed=10;
static boolean upFlag=false;
static boolean downFlag=false;
static boolean leftFlag=false;
static boolean rightFlag=false;
public static void main(String[] args)
{ Main1214 a= new Main1214();
while(true)
{
try {Thread.sleep(30);}
catch (InterruptedException e) {e.printStackTrace();}
if(upFlag) {y-=speed;}//向上移动
if(downFlag) {y+=speed;}//向下移动
if(leftFlag) {x-=speed;}//向左移动
if(rightFlag) {x+=speed;}//向右移动
a.repaint();//重绘
}
}
Main1214()
{
this.setTitle("移动滑块"); //设置窗体标题
this.setDefaultCloseOperation(3);//设置窗体关闭方式
this.setSize(700,700); //设置窗体大小
this.setResizable(true); //设置窗体大笑可变
this.setLocationRelativeTo(null);//设置窗体居中
JPanel drawPanel=new JPanel(){ //创建画板对象,用来画图
public void paint(Graphics g)
{
super.paint(g);
g.fillRect(x,y,30,30); //画出方块
}
};
this.addKeyListener(new KeyAdapter() //匿名对象和匿名内部类的使用
{
//关键代码**************************************************************************
public void keyPressed(KeyEvent e) //按下按键
{
if(e.getKeyCode()==KeyEvent.VK_W){upFlag=true;}
if(e.getKeyCode()==KeyEvent.VK_S){downFlag=true;}
if(e.getKeyCode()==KeyEvent.VK_A){leftFlag=true;}
if(e.getKeyCode()==KeyEvent.VK_D){rightFlag=true;}
}
public void keyReleased(KeyEvent e)//松开按键
{
if(e.getKeyCode()==KeyEvent.VK_W){upFlag=false;}
if(e.getKeyCode()==KeyEvent.VK_S){downFlag=false;}
if(e.getKeyCode()==KeyEvent.VK_A){leftFlag=false;}
if(e.getKeyCode()==KeyEvent.VK_D){rightFlag=false;}
}
//关键代码**************************************************************************
});
this.add(drawPanel); //将画板添加到窗体
this.setVisible(true); //设置窗体可见
}
}