程序如何同时允许多个键盘输入?

时间:2015-08-20 10:32:15

标签: java swing keyboard keylistener java-2d

我正在写一个简单的游戏,基本上有两个人控制精灵和战斗。我用一个关键的监听器编写了这个程序,但这只允许我在任何给定的时间控制一个精灵。我愿意在KeyListener旁边使用不同的键盘输入方法,尽管我更喜欢坚持使用KeyListener。我听说过KeyBindings,但我无法弄清楚如何使用它们。我有一个想法是多线程,但我对这个概念并不是很满意。这是我的代码:(请留下我的代码应该是一个例子。另外,第二个精灵是用一个单独的类来控制的,这个类几乎与这个类相同但只是使用不同的键。)

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;

public class KeyHandler implements KeyListener {

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_UP) {
            Display.up = Display.up + 7;
        }

        if (key == KeyEvent.VK_DOWN) {
            Display.down = Display.down + 7;
        }

        if (key == KeyEvent.VK_RIGHT) {
            Display.right = Display.right + 7;
        }

        if (key == KeyEvent.VK_LEFT) {
            Display.left = Display.left + 7;
        }

        if (key == KeyEvent.VK_SPACE) {
            Display.fireMissile();
            Display.whichSpriteInt = 0;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}

1 个答案:

答案 0 :(得分:0)

  

目前它不控制一个对象,它只是绘制一个缓冲的图像,然后用键输入改变坐标

因此,在生成KeyEvent时执行Action。

Key Bindings的工作方式没有区别。您将Action映射到KeyStroke。它不会改变您编写代码的方式,只会改变您处理事件的方式。

结帐Motion Using the Keyboard。前两个示例(一个使用KeyListener,另一个使用Key Binding)演示了这个概念。这两个类都定义了一个相同的move(...)方法,唯一的区别在于如何调用该方法。

  

我可以更改格式,但需要大量代码重新编写,我更愿意避免使用。

现在没有时间学习如何更好地构建/设计您的程序。 Swing是围绕创建动作的概念设计的,因此可以通过键盘或鼠标调用Action。

说过你真的想看看KeyboardAnimation.java的例子。这门课完全符合你的要求。它使用Timer进行动画制作,并允许不同的KeyStrokes移动不同的对象。