当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

按键不冲突

发表于: 2015-02-18   作者:永夜-极光   来源:转载   浏览:
摘要: 在编写雷霆战机游戏的时候,发现按键会相互冲突,左右移动会有卡顿现象,后来参考了大量网页,想到一个解决思路,经测试可以运行. 1.给按键keyPressed 和keyRelease都设置一个标志位 2.按下按键将标志位设置为true 3.松开按键将标志位设置为false 4.在线程中执行具体移动事件   具体演示源代码如下 package s0218按键不冲突; imp

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

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

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
这是一个困扰我很久的问题,今天早上洗脸的时候突然想起,事实上也没有一开始想象中的那么困难,不
在tnsnames.ora文件中检查设置好像没什么问题,用sqlplus也可以正常操作orcl 问题找到了,其实可简
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.csdn.net/woshixingaa
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.csdn.net/woshixingaa
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.csdn.net/woshixingaa
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.csdn.net/woshixingaa
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.csdn.net/woshixingaa
LED对应的IO口为GPB的5678口 按键对应的IO口为GPF的0123口 平台:RealView MDK #include<S3C2440
1 创建Git资源库,残酷目录信息 <p style="margin: 0cm 0cm
本文标签:养心 来自:美国小学的思想品德教育 感谢田甜在微博的分享! 用中间人,调解人(Use a me
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号