【问题标题】:How have a program allow multiple keyboard inputs simultaneously?一个程序如何同时允许多个键盘输入?
【发布时间】:2015-08-20 10:32:14
【问题描述】:

我正在编写一个简单的游戏,基本上有两个人控制精灵和战斗。我用一个关键监听器编写了这个程序,但这只允许我在任何给定时间控制一个精灵。我愿意在KeyListener 旁边使用不同的键盘输入方法,尽管我更愿意坚持使用我的KeyListener。我听说过KeyBindings,但我真的不知道如何使用它们。我的一个想法是多线程,但我对这个概念不太满意。这是我的代码:(请举例说明我的代码应该是什么。另外,第二个精灵由一个单独的类控制,该类几乎与这个相同,但使用不同的键。)

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;

public class KeyHandler implements KeyListener {

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_UP) {
            Display.up = Display.up + 7;
        }

        if (key == KeyEvent.VK_DOWN) {
            Display.down = Display.down + 7;
        }

        if (key == KeyEvent.VK_RIGHT) {
            Display.right = Display.right + 7;
        }

        if (key == KeyEvent.VK_LEFT) {
            Display.left = Display.left + 7;
        }

        if (key == KeyEvent.VK_SPACE) {
            Display.fireMissile();
            Display.whichSpriteInt = 0;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}

【问题讨论】:

  • thisthis
  • 您需要“轮询”键。看看这个article
  • @LuxxMiner ya KeyBinding 的问题是我的代码格式。目前它不控制一个对象,它只是绘制一个缓冲的图像,然后用键输入改变坐标。 (我有一个计时器正在运行,它每 10 毫秒重绘一次)我想我可以更改格式,但它需要大量的代码修改,我宁愿避免它。

标签: java swing keyboard keylistener java-2d


【解决方案1】:

目前它不控制一个对象,它只是绘制一个缓冲图像,然后通过键输入改变坐标

所以当 KeyEvent 产生时你会做一个动作。

键绑定的工作方式没有什么不同。您将 Action 映射到 KeyStroke。它不会改变您编写代码的方式,只会改变您处理事件的方式。

查看Motion Using the Keyboard。前两个示例(一个使用 KeyListener,另一个使用 Key Binding)演示了这个概念。这两个类都定义了一个相同的move(...) 方法,唯一的区别是方法的调用方式。

我可以更改格式,但这需要大量代码修改,我希望避免它。

现在是学习如何更好地构建/设计程序的最佳时机。 Swing 是围绕创建动作的概念设计的,因此可以通过键盘或鼠标调用动作。

话虽如此,你真的很想看看KeyboardAnimation.java 的例子。这个类正是你想要的。它使用 Timer 进行动画制作,并允许不同的 KeyStroke 移动不同的对象。

【讨论】:

  • 好的,谢谢。将对此进行调查。目前我无法访问计算机,而我正在使用移动设备。
  • 好的,猜猜你的答案是我会用的那个,因为没有其他人回复过!谢谢!
猜你喜欢
  • 2017-08-22
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多