因此,为了参考,我正在关注Trystan's roguelike tutorial for java。
上面的教程使用了Key Listeners,它不适用于Mac OS X(并且社区似乎不鼓励),因此我尝试更改代码以使用Key Bindings。
这是问题所在。在他的" roguelike游戏"中,游戏被划分为屏幕,其中每个屏幕具有针对特定键的单独动作。例如,"开始屏幕"将玩家发送到"播放屏幕"按下回车键:
public class StartScreen implements Screen {
public void displayOutput(AsciiPanel terminal) {
terminal.write("rl tutorial", 1, 1);
terminal.writeCenter("-- press [enter] to start --", 22);
}
public Screen respondToUserInput(KeyEvent key) {
return key.getKeyCode() == KeyEvent.VK_ENTER ? new PlayScreen() : this;
}
}
同时播放屏幕"将玩家发送到" Win屏幕"按下回车键:
public class PlayScreen implements Screen {
public void displayOutput(AsciiPanel terminal) {
terminal.write("You are having fun.", 1, 1);
terminal.writeCenter("-- press [escape] to lose or [enter] to win --", 22);
}
public Screen respondToUserInput(KeyEvent key) {
switch (key.getKeyCode()){
case KeyEvent.VK_ESCAPE: return new LoseScreen();
case KeyEvent.VK_ENTER: return new WinScreen();
}
return this;
}
}
现在,从我可以从密钥绑定示例中看到的this和this,所有绑定和操作似乎都被"转储"成为一个班级。这是不能令人满意的,因为:
是否有办法让Key Bindings让一个按键执行不同的动作,具体取决于" Screen"?我会使用条件吗?我可以将Key Binding逻辑放在其他类(Screens)中,然后在主类中调用它们,就像上面的Key Listeners一样吗?
答案 0 :(得分:2)
键绑定不一定要转储到一个类中。它们与输入映射相关联,而输入映射又与特定的JComponent
相关联。如果您在表示该屏幕的WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
的{{1}}输入映射中注册特定于屏幕的绑定,那么当该屏幕中的任何组件具有键盘焦点时,它们将被识别(假设其间的组件没有用自己的方法覆盖绑定),但不是当不同屏幕中的组件具有焦点时。
总的来说,该系统非常灵活。您可以考虑阅读the Java Tutorial section on this topic以加快速度。