繁体   English   中英

具有多个动作的Java键绑定

[英]Java key bindings with multiple actions

因此,作为参考,我正在遵循Trystan的针对Java的roguelike教程

上面的教程使用了“密钥侦听器”,该侦听器不适用于Mac OS X(并且似乎不鼓励社区使用),因此我试图将代码更改为使用“密钥绑定”。

这是问题。 在他的“流氓类游戏”中,游戏被划分为多个屏幕,其中每个屏幕都有针对特定键的单独操作。 例如,按下回车键后,“开始屏幕”会将播放器发送到“播放屏幕”:

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;
    }
}

在按下回车键的同时,“播放屏幕”将播放器发送到“获胜屏幕”时:

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;
    }
}

现在,从键绑定示例(例如thisthis)中可以看到,所有的绑定和动作似乎都“转储”到一个类中。 这是不令人满意的,因为:

  1. 一次击键只会导致一个动作(我想我可以让该动作进行一次切换,检查我所在的屏幕,然后执行特定于所述屏幕的代码,但是也许有更好的方法。)
  2. 确定来自/针对哪个屏幕的动作变得更加困难。

是否有一种方法可以使按键绑定使一个按键根据“屏幕”执行不同的操作? 我会只使用条件吗? 是否可以将键绑定逻辑放在其他类(屏幕)中,然后再在主类中调用它们,就像上面的键侦听器一样?

键绑定不一定要转储到一个类中。 它们与输入映射关联,而输入映射又与特定的JComponent关联。 如果您在代表该屏幕的JComponentWHEN_ANCESTOR_OF_FOCUSED_COMPONENT输入映射中注册了特定于屏幕的绑定,则当该屏幕中的任何组件都具有键盘焦点时(假设两者之间的组件未使用其自身覆盖该绑定),它们将被识别,但是当另一个屏幕中的组件具有焦点时则不会。

总体而言,该系统非常灵活。 您可以考虑阅读有关此主题的Java教程部分,以使自己入门。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM