【发布时间】:2016-09-06 04:39:12
【问题描述】:
我正在尝试用 Java 制作游戏,这是我第一次处理多线程(嗯,除了通过 Clip 类同时播放音乐之外。)我有一个扩展 JPanel 的 Canvas 类,但在 Canvas 类中我还有一个 KeyListener 来接受输入,如下所示:
private class myKeyListener implements KeyListener
{
public void keyPressed(KeyEvent keyEvent)
{
if(keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE){System.exit (0);}
Thread thread3 = new Thread()
{
public void run() {
if(keyEvent.getKeyCode() == KeyEvent.VK_RIGHT){moveX(5, player1);}
if(keyEvent.getKeyCode() == KeyEvent.VK_LEFT){moveX(-5, player1);}
if(keyEvent.getKeyCode() == KeyEvent.VK_UP){moveY(-5, player1);}
if(keyEvent.getKeyCode() == KeyEvent.VK_DOWN){moveY (5, player1);}
}
};
Thread thread4 = new Thread()
{
public void run() {
if(keyEvent.getKeyCode() == KeyEvent.VK_D){moveX(5, player2);}
if(keyEvent.getKeyCode() == KeyEvent.VK_A){moveX(-5, player2);}
if(keyEvent.getKeyCode() == KeyEvent.VK_W){moveY(-5, player2);}
if(keyEvent.getKeyCode() == KeyEvent.VK_S){ moveY(5, player2);}
}
};
Thread thread5 = new Thread()
{
public void run() {
repaint();
}
};
thread3.start();
thread4.start();
thread5.start();
try{
thread3.join();
thread4.join();
thread5.join();
}
catch (Exception e){System.out.println(e);}
repaint();
}
public void keyReleased(KeyEvent keyEvent)
{
}
public void keyTyped(KeyEvent keyEvent)
{
}
}
我的目标是拥有它,这样一个人就可以在画布上同时移动两个玩家(它们是矩形)。目前,一次只能移动一个,但不能同时移动两个。这是我第一次处理多线程,所以如果我犯了一个菜鸟的错误,我提前道歉。
【问题讨论】:
-
我不明白你想做什么。您将无法使用此代码同时移动两个玩家,因为您不能同时按下两个键。每按一次键,keyPressed()方法就会被调用一次。
-
你的意思是两个人使用同一个键盘,每个人控制一个玩家?
-
@Daniel 是的,我做到了。例如,在同一个键盘上,一个人将使用箭头键来控制 Rectangle player1,而另一个人将使用 WASD 来控制 Rectangle player2
-
无需使用一个线程来移动每个玩家。我建议您使用一个线程来执行游戏循环(更新玩家位置,然后更新屏幕)。你能发布完整的代码,所以我可以帮忙吗?此代码无法编译。
-
@Daniel 我已将其作为答案发布在下面,因为代码太长,无法放入评论
标签: java multithreading java-canvas