Java游戏:密钥绑定和EDT

时间:2014-01-03 11:31:48

标签: java multithreading swing key-bindings

我正在开发Java游戏。在游戏中,玩家将能够使用键绑定来控制在屏幕上移动的坦克。每个箭头按钮都会以不同的方向移动水箱。

我想知道,如果我在程序中使用Key Bindings的方式是正确的,并且不应该导致EDT或之后的任何其他问题。

我将简要解释程序的结构,以及我如何使用Key Bindings。

  • 有一个Board类,一个扩展JPanel并且具有的类 大多数游戏逻辑。它还显示图形。

  • 有一个KeyBindingsRunnabel类,一个实现Runnable的类。这个 class包含所有KeyBindings代码。

  • Board包含游戏循环。游戏循环发生在一个 线。在线程中,但在游戏循环之前,新的线程是 创建并启动,该线程运行KeyBindingsRunnabel

(还有一个Main类扩展了JFrame并创建了一个Board实例,但那是无关紧要的。)

我将简要介绍所有这些:

以下是KeyBindingsRunnabel类的代码:

public class KeyBindingsRunnable implements Runnable {

    Board b;

    Action upAction,leftAction;
    InputMap inputMap;
    ActionMap actionMap;

    public KeyBindingsRunnable (Board b){

        this.b = b;
        inputMap = b.getInputMap();
        actionMap = b.getActionMap();

    public void run() {

        leftAction = new AbstractAction(){
            public void actionPerformed(ActionEvent e){
                // Code to move tank left.
            }
        };

        rightAction = new AbstractAction(){
            public void actionPerformed(ActionEvent e){
                // Code to move tank right.
            }
        };

        inputMap.put(KeyStroke.getKeyStroke("LEFT"),"leftAction");
        inputMap.put(KeyStroke.getKeyStroke("RIGHT"),"rightAction");

        actionMap.put("leftAction",leftAction);
        actionMap.put("rightAction",rightAction);

    }

}

Board类使用KeyBindingsRunnable的方式如下:

Board类还实现了Runnable。它在构造函数中包含一个线程声明:

Thread gameloop = new Thread(this);
gameloop.start();

在Board的run()方法中,有两件事:游戏循环,在循环之前,创建一个运行KeyBindingRunnable的新线程。

Board的run()方法如下所示:

public void run(){

    Thread keyBindingsThread = new Thread(new KeyBindingRunnable(this));
    keyBindingsThread.start();

         while(gameIsRunning){
         // The loop.
         // .....
         }

}

我的问题是:这是使用密钥绑定而不用EDT中断的正确方法,一般来说是正确的方法吗?

在2D游戏中使用键绑定是否有更有效/更安全/更短的方式?

非常感谢:)

1 个答案:

答案 0 :(得分:0)

我阅读的评论太多,所以我不知道我是在说什么新东西还是只是重复一些东西。

我看待它的方式。 KeyBindings仅用于指示键盘上键的状态。

Motion Using the Keyboard查看KeyboardAnimtion.java。在该示例中,按下键,键被添加到Map,并且当键被释放时,键被从地图中移除。这是键绑定的唯一功能,用于跟踪按下的键以及该键的相关移动。

然后,该示例使用Timer来计划对象的动画。当Timer触发时,调用move()方法并根据Map中的键移动对象。

  

Swing Timer不允许我使用一种游戏循环,它已被证明可以不间断地以恒定速度运行游戏。

没有理由使用Timer。如果你的游戏有自己的循环,那么你应该能够直接调用move()方法。但是,所有这一切都是控制重绘请求是在一个恒定的时间进行的,它不能保证绘画是立即完成的,尽管通常应该立即处理绘画请求,除非系统真的很忙。

我首先要使用Timer,看看会发生什么。