求助,Java如何响应同时按多个键盘按键?

Gavava 2015-05-24 05:04:47
求助,Java如何响应同时按多个键盘按键?
现在写个小游戏,当人物有移动和发射子弹的功能。
但是在移动的过程中发射子弹,人物就会停下来。
我想同时响应两个按键,互不影响。

还想问一下,
测试时感觉操作很不好,比如想一直往右走,按住右键会卡顿一下,才一直移动,
不知道有什么解决办法。

谢谢各位。
...全文
1122 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dueduel 2015-12-11
  • 打赏
  • 举报
回复
需要看性价比高的键盘的,可以戳 【idzcp.com/?a=index&m=article&id=12】 看看,里边有按预算详细介绍的,整理的不错的,能节省不少挑选时间。
疯狂熊猫人 2015-05-27
  • 打赏
  • 举报
回复
引用 6 楼 bihaobo 的回复:
[quote=引用 4 楼 crazypandariy 的回复:] 发子弹的时候人会停下来,我猜你就只有一个主线程控制整个游戏吧。如果说人在移动,并且可以发子弹,需要用两个线程控制,一个控制移动,一个控制发子弹。
我是在面板里监听键盘,根据按键调用人物的移动和射击函数,我感觉是没有同时响应两个按键的原因。 能不能详细说一下怎么加线程。 [/quote] 就是在你的程序启动后,创建俩线程,一个线程Move控制移动(该线程提供一个移动的方法),另一个线程Shoot 控制射击(提供一个射击的方法)。接收到移动按钮事件,调用Move的移动方法。收到射击按钮事件,调用Shoot方法。 给你一个简单的示例代码:
public class MoveThread extends Thread {

	private XXX xxx;//
	private LinkedBlockingQueue<Point> queue = new LinkedBlockingQueue<Point>();
	
	public MoveThread(XXX xxx){
		this.xxx = xxx;
	}
	
	public void move(int x,int y){
		queue.add(new Point(x, y));
	}
	
	@Override
	public void run() {
		while(!Thread.interrupted()){
			Point point = queue.take();
			//下面根据point进行移动操作
			xxx.xxx();
		}
	}
}
或者
public class MoveThread extends Thread {

	private XXX xxx;//
	private Point point;
	
	public MoveThread(XXX xxx){
		this.xxx = xxx;
	}
	
	public void move(int x,int y){
		synchronized (this) {
			point = new Point(x, y);
			this.notifyAll();
		}
	}
	
	@Override
	public void run() {
		while(!Thread.interrupted()){
			synchronized (this) {
				if(point==null){
					this.wait();
				}else{
					//移动处理
					point = null;//处理完之后,将point置为null
				}
			}
		}
	}
}
飏飏一蝶 2015-05-24
  • 打赏
  • 举报
回复
代码不全,Gave的代码呢?
Gavava 2015-05-24
  • 打赏
  • 举报
回复
发上来代码:
public class PlayAct1 extends JPanel implements Runnable,KeyListener {
	
	//背景图片
	BufferedImage backgroundImage;
	//主角
	Gava gava;
	
	
	public PlayAct1() {
		// TODO Auto-generated constructor stub
		init();
		setBounds(0, 0, screenHeight, screenHeight);
		setFocusable(true);
		addKeyListener(this);
		backgroundImage=Resource.backGrpundImages[0];
		setVisible(true);
	}
	
	private void init() {
		
		gava=new Gava(160, 560, 80, 80,Resource.gavaImages);
	}
	
	private void UpDateBG(){
		gava.UpDateBullet();
	}
	
	public void run(){
		while(true){
		this.UpDateBG();
		this.repaint();
		try {
			Thread.sleep(40);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		}
	}
	
	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		g.drawImage(backgroundImage, 0, 0,this);
		gava.DrawGava(g, this);
	}
	
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
		int key=e.getKeyCode();
		switch (key) {
		case KeyEvent.VK_W://跳跃
			gava.Jump();break;
		case KeyEvent.VK_A://向左移
			gava.ToLeft();break;
		case KeyEvent.VK_D://向右移
			gava.ToRight();break;
		case KeyEvent.VK_J://
			gava.Shoot();break;
		case KeyEvent.VK_F:
			//gava.GetBullet(bullet);
		default:
			break;
		}

	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	
}
飏飏一蝶 2015-05-24
  • 打赏
  • 举报
回复
上代码,okay?
请先阅读帮助文档:http://ismyway.com/help [2009.1.1] Ver 3.2.26 ※如果安装提示证书过期或无法安装,请在手机上将时间改为2008.8.8,安装设置完成后再将日期改回即可!※ 增加天语的按键映射 增加三星的背景灯控制功能(该功能未在真机上测试过) 删除图片浏览中的部分功能,由于这部分功能需要较大的内存,导致在大部分手机上无法完成,同时也引起背景图片无法设置成功 触摸屏用户可以不再受滚动条限制,在屏幕上任意地方都可以进行拖动 选择键盘映射为其它时无法再次更改的BUG 用户输入的颜色值无法保存的BUG 修正英文单词分词时会多添加一个空行的BUG 繁体语言措词上的修正 阅读设置中增加一个“文件缓存”选项,默认情况下是开启的,在NOKIA手机上会提高UMD等文件的表现,但由于测试并不充足,如果程序经常在阅读时出错,请关闭该选项(其它手机是否开启该选项并无明显的影响) 修正编辑文件后无法保存的BUG [2008.10.27] Ver 3.2.24 ※如果安装提示证书过期或无法安装,请在手机上将时间改为2008.8.8,安装设置完成后再将日期改回即可!※ 改进的颜色选择方式 允许用户重新选择键盘映射 HTML阅读时的错误 进一步完善编辑功能(仍有少许BUG,请继续反馈,谢谢) 新建文件后自动跳转到编辑中 改进的文件操作方式,速度轻微提升 UMD速度明显提升,并且减少内存占用,特别是在NOKIA手机上,表现提升超过600% 改进的输入框模式,以使得能适应更多的手机如天语等 [2008.10.21] Ver 3.2.23 为了提高运行效率,以下功能在LITE上将被取消(自定义欢迎页问候语;欢迎页背景图) 取消了JAR的支持,提高运行效率 修正打开大ZIP文件时的内存溢出错误 ·修正:  自动滚屏到末尾时,滚屏功能将停止 [2008.10.4] Ver 3.2.22 暂时删除了播放功能及网络相关的功能,由于以上两项功能一直没有能稳定下来,故暂时删除 增强了ZIP功能,支持带文件夹结构的ZIP/JAR文件 (对于大部分JAR电子书都,可以从文件管理器中找到非.class结尾的文件,并且选择打开为UNICODE/TXT阅读) (对于NOKIA手机及其它部分手机,由于安全策略的限制,在Anyview的文件管理器中无法查看后缀为.jar的文件) 自定义问候语(系统路径下dictum.rc文件,格式参见jar包中的dictum.rc文件,保存时使用UTF-8编码,可写条目为0~9/a~z/A~Z,置空时表示不显示问候语) ·修正:  0键在各偏好中切换时亮度混乱的问题  部分手机上无法新建文件夹 [2008.9.11] Ver 3.2.21 修正动画参数无法保存的BUG 动画效果不再对阅读翻页有作用 [2008.8.29] Ver 3.2.21 可将正在阅读的内容通过短信与好友分享 增加一种新的滚屏方式:波浪,同时,阅读时3键不再使用默认的像素滚屏,而会使用最后一次使用的滚屏方式 任何可用的外置字库都可以作为内置字库存在,在jar包中存在dot.font会被当为内置字库加载 加快大文件的打开速度,特别是对于NOKIA手机,S60上,打开20M文件,97%左右的位置不超过15秒 允许用户打开动画效果 ·M600/P990/P1/W950  修正键盘映射时“内存不足”的BUG ·E680/A780  选中后台播放后无法启动的BUG [2008.7.30] Ver 3.2.20 调整部分索爱手机上背景灯控制的逻辑 修正看图片时按0键出错的BUG 旋转屏幕引起的字外出 打开LRC最后出错 阅读到尾部弹出“上一个/下一个”窗口中的文件名过长不刷新的问题 偏好切换时亮度混乱的问题 在NOKIA上,当系统路径设置为根目录是无法启动的BUG E398上可以开关键盘灯 UIQ系统在退出时可以保持亮度 索爱上按“返回”键后导致阅读出现白屏的BUG 阅读时切换屏幕方向导致字体超出屏幕的BUG 欢迎屏幕上的日期使用中文显示 如果使用触屏手机,跳转改为进度条模式,以方便触屏操作 系统路径下如果存在bg.png文件,则会作为欢迎界面的背景图片显示(右下角) 减少跳转及翻页中出现乱码的机率 提高阅读时绘图效率,滚屏效率同样提高 播放时,暂停会导致声音爆至最大的BUG 内置“忘记月亮”制作的两款主题《典雅红》《黑橙》,并且更换主题不再要求退出 文件管理器中支持“剪切”功能 文件管理器中新增转换UMD为TXT的功能(解开操作,解开2无效!) 增加了编辑功能(尽管没有限制文件大小,但请别编辑过大的文件,另外,为了提高速度,不进行全文排版,有时候表现可能会有些不习惯),以后会进一步完善 启动时,会自动识别NOKIA、SONYER

50,503

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧