• 主页
  • Java SE
  • J2ME
  • Web开发
  • Java EE
  • Eclipse

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

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

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

谢谢各位。
...全文
320 点赞 收藏 5
写回复
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?
回复 点赞
发动态
发帖子
Java
创建于2007-09-28

1.8w+

社区成员

8.1w+

社区内容

Java相关技术讨论
社区公告
暂无公告