按键不冲突

在编写雷霆战机游戏的时候,发现按键会相互冲突,左右移动会有卡顿现象,后来参考了大量网页,想到一个解决思路,经测试可以运行.

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); //设置窗体可见
		}
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值