我正在开发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游戏中使用键绑定是否有更有效/更安全/更短的方式?
非常感谢:)
答案 0 :(得分:0)
我阅读的评论太多,所以我不知道我是在说什么新东西还是只是重复一些东西。
我看待它的方式。 KeyBindings仅用于指示键盘上键的状态。
从Motion Using the Keyboard查看KeyboardAnimtion.java
。在该示例中,按下键,键被添加到Map,并且当键被释放时,键被从地图中移除。这是键绑定的唯一功能,用于跟踪按下的键以及该键的相关移动。
然后,该示例使用Timer来计划对象的动画。当Timer触发时,调用move()方法并根据Map中的键移动对象。
Swing Timer不允许我使用一种游戏循环,它已被证明可以不间断地以恒定速度运行游戏。
没有理由使用Timer。如果你的游戏有自己的循环,那么你应该能够直接调用move()方法。但是,所有这一切都是控制重绘请求是在一个恒定的时间进行的,它不能保证绘画是立即完成的,尽管通常应该立即处理绘画请求,除非系统真的很忙。
我首先要使用Timer,看看会发生什么。