【问题标题】:Java game: How to overcome a hardware-limitation of a keyboardJava 游戏:如何克服键盘的硬件限制
【发布时间】:2014-01-07 11:42:03
【问题描述】:

我正在开发一个 Java 2D 游戏,它需要同时按住最多六个键。 该游戏适合两个玩家在同一个键盘上同时玩。

但是,我运行该程序的所有三台计算机一次最多只能持有三个键。他们都无法对持有的三个以上的键做出反应。 似乎在已经按住三个键后按下一个新键,要么取消其他键保持,要么被忽略。

有人告诉我这是硬件问题。大多数键盘一次不能处理超过三个键。但是很多游戏都需要这个,而且它们不需要特殊的游戏键盘就可以在我的电脑上运行而不会出现问题。

因此必须有一种解决方案,让游戏可以在任何标准键盘上玩。

如果有,您能否向我解释一下如何在我的程序中对其进行编码? (我使用键绑定)。

游戏的控制:

玩家 1

  • 旋转精灵并设置移动角度:左箭头
  • 旋转精灵并设置移动角度:右箭头
  • 向前移动:向上箭头
  • 发射导弹:ENTER键

玩家 2

  • 旋转精灵并设置移动角度:'A'键
  • 旋转精灵并设置移动角度:'D'键
  • 前进:'W'键
  • 发射导弹:'T'键

相关代码:

Key Bindings 部分:

// An action for every key-press.
// Each action sets a flag indicating the key is pressed.

    leftAction = new AbstractAction(){
        public void actionPerformed(ActionEvent e){     
            keysPressed1[0] = true;
        }
    };

    rightAction = new AbstractAction(){
        public void actionPerformed(ActionEvent e){
            keysPressed1[1] = true;
        }
    };

// And so on...
// ....

// An action for every key-release.
// Each action sets a flag indicating the key was released.
// This is only necessary for some of the keys.

    leftReleased = new AbstractAction(){
        public void actionPerformed(ActionEvent e){
            keysPressed1[0] = false;
        }
    };

    rightReleased = new AbstractAction(){
        public void actionPerformed(ActionEvent e){
            keysPressed1[1] = false;
        }
    };

// And so on...
// ....

// Binding the keys to the actions.

    inputMap.put(KeyStroke.getKeyStroke("UP"),"upAction");
    inputMap.put(KeyStroke.getKeyStroke("LEFT"),"leftAction");
// etc...

    actionMap.put("upAction",upAction);
    actionMap.put("leftAction",leftAction);
// etc...

Board 类中。它拥有大部分游戏代码。 这部分检查标志并对按键和释放做出反应。

            keysPressed1 = tank1.getKeys(); // get flags-array of tank1.
            keysPressed2 = tank2.getKeys(); // get flags-array of tank2.

            if(keysPressed1[0]==true) // if LEFT is pressed.
                tank1.setAngle(tank1.getAngle()-3);

            if(keysPressed1[1]==true) // if RIGHT is pressed.
                tank1.setAngle(tank1.getAngle()+3);

            if(keysPressed1[2]==true){ // if UP is pressed.
                tank1.setDX(2 * Math.cos(Math.toRadians(tank1.getAngle())));
                tank1.setDY(2 * Math.sin(Math.toRadians(tank1.getAngle())));
            }

            if(keysPressed1[2]==false){ // if UP is released.
                tank1.setDX(0);
                tank1.setDY(0);
            }

      // And the same for the second player's keys...

这主要是在我的程序中对按键和按键释放做出反应的方式。当一个键被按下或释放时,一个标志被设置。 Board 类在每个游戏循环周期读取标志并做出相应反应。

正如我所说,程序无法对同时按住 3 个以上的键做出正确反应,这可能是因为键盘的原因。有没有办法编写解决方案?

我们将不胜感激。 非常感谢

【问题讨论】:

  • @Sergi 不是。您发布的问题中的那个人问如何一次处理多个按键,这不是我问的。我知道如何一次处理 3 个按键,但我问如何避免导致程序无法接受超过 3 个按键的硬件问题。
  • 无法通过软件避免这种情况。这种方式对键盘制造商来说更便宜,所以如果您同时想要更多按钮,则必须购买更昂贵的键盘。
  • 那为什么我的电脑上有一个游戏,我不断地一次按三个以上的键并且它可以工作?另外,这个游戏最多可以有 4 名玩家在同一个键盘上,每个人一次按下 3 个按钮。它再次在我的电脑上运行良好。所以必须有一种软件方式绕过硬件限制。
  • 试试这个键盘测试器,看看你的键盘可以同时检测到多少个按键 -> microsoft.com/appliedsciences/content/projects/…
  • 看看你的游戏,看起来只有两个连续按下的键(左/右/前锋 * 2 名玩家)加上周期性的开火命令。巧妙的设计(最重要的是鼓励玩家不要按住开火按钮)应该让这款游戏只处理非常罕见的问题(两个玩家同时开火)。此外,您应该能够找到可以按下超过 3 个的键组,尽管这可能会因键盘而异

标签: java key-bindings keystroke


【解决方案1】:

您确定您没有遇到重影吗?如果是重影,则是硬件限制。

这是一个测试者 -> http://www.microsoft.com/appliedsciences/content/projects/KeyboardGhostingDemo.aspx

这里是重影的描述 -> http://www.microsoft.com/appliedsciences/antighostingexplained.mspx

【讨论】:

    【解决方案2】:

    我对这个主题不是很熟悉,但是在做一些研究时我偶然发现了 LWJGL。根据您的问题,这是一个 Java 游戏库,看起来很有前途。 Take a look at this.

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2011-06-26
      • 2015-08-01
      相关资源
      最近更新 更多