我的一个大问题是我正在编写一个游戏。我在一个jframe中有2个玩家,他们可以玩cuncurrent。第一个玩家用箭头键玩,第二个用w / a / s / d键玩。我的instrutor说我要实现cuncurrent play我应该实例化两个线程,每个线程管理自己的特殊玩家..我很困惑,我怎么了可以为两个玩家提供两个线程,只有他们之间的差异是他们听的关键...
另一个可能对我有帮助的问题是,我可以让一个只听一些特殊键的听众吗?例如,我只是一个只听w / s / a / d按钮的听众?(我熟悉keyevent。 getkeycode但它不是我的意思,因为我想要一个从不听另一个键的听众,这是听所有的键,并在决定选择编码器最喜欢的键)
如果你帮助我,我将永远是伟大的。答案 0 :(得分:2)
您可以像这样定义自己的密钥处理器(mainFrame是JFrame实例)
ActionMap actions = ((JComponent)mainFrame.getContentPane()).getActionMap();
InputMap inputs = ((JComponent)mainFrame.getContentPane()).getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Action a=new AbstractAction() {
public void actionPerformed(ActionEvent e) {
//call your action code here
}
};
actions.put("myAction", a);
inputs.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.CTRL_DOWN_MASK), "myAction");
答案 1 :(得分:2)
在此之前不要忘记在Focus检查JPanel之前将KeyListener设置为KeyBindings以获得扩展的功能,here是非常有用的信息Swing中的听众
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myPanel.grabFocus();
myPanel.requestFocus();//or requestFocusinWindow()
}
});
答案 2 :(得分:1)
键侦听器将侦听所有键。你只需要对你需要的那些做出反应。由于您可以拥有任意数量的关键侦听器,因此每个播放器都有一个关键侦听器没有问题。
答案 3 :(得分:0)
keyListener侦听所有按下的键。
但是在代码中你可以检查按下了哪个键,如果它不是你想要作出反应的键之一,则忽略它。实际上,您可以为两个侦听器使用相同的类,只需传递每个都必须作为参数作出反应的键。
话虽如此,你不应该需要两个线程。我理解两个线程可以避免GUI冻结(一个用于管理GUI的线程,另一个用于执行位置计算的线程)。当然,作为家庭作业,可以这样询问,以便学习线程的基本概念。
答案 4 :(得分:0)
好的,所以我会怎么做,我会有2个类,一个叫游戏,另一个玩家,游戏扩展你的JFrame,玩家实现你的keyListener,在游戏中你可以有2个Player实例,一个用于实例使用D键而另一个会使用asdw或其他什么,这是一个例子:
public void keyPressed(KeyEvent e)
{
switch(playerNumber)
{
case PLAYER_1:
if(e.getKeyCode==VK_UP)
{
//do some code for an "up event"
}
if(e.getKeyCode==VK_DOWN)
{
//do some code for a "down event"
}
if(e.getKeyCode==VK_LEFT)
{
//do some code for a "left event"
}
if(e.getKeyCode==VK_RIGHT)
{
//do some code for a "right event"
}
break;
case PLAYER_2:
if(e.getKeyCode==VK_W)
{
//do some code for an "up event"
}
if(e.getKeyCode==VK_S)
{
//do some code for a "down event"
}
if(e.getKeyCode==VK_A)
{
//do some code for a "left event"
}
if(e.getKeyCode==VK_D)
{
//do some code for a "right event"
}
break;
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public static final int PLAYER_1 = 0;
public static final int PLAYER_2 = 1;
所有你需要做的就是告诉玩家实例它的player1或者player2,这很容易,如果你需要更多的例子或任何东西让我知道,我做了很多热门游戏(超过1人的游戏)正在一台电脑上玩。)