带键绑定的线程

我对Java图形和线程很陌生,我正在尝试制作一个游戏(特别是Pong)。这个想法是两个人可以在同一个键盘上玩(也就是说,有两个桨通过不同的键控制)。目前,两名球员不能同时移动他们的桨。

有解决办法吗?答案是分开的线程吗?

如果可能的话,我希望这些桨能同时移动(至少看起来是这样)。

最新情况:似乎使用了Set<Integer>存储按下的键是最好的选择。我已经这样做了(而且工作正常),但我想知道这些代码中是否有任何代码不在事件分派线程(EDT)上,以及是否需要使用SwingUtilities.invokeLater();..以下是必要的代码:

private Set<Integer> keysDown = Collections.synchronizedSet(new HashSet<Integer>());public void keyPressed(KeyEvent e) {
    keysDown.add(e.getKeyCode());}public void keyReleased(KeyEvent e) {    
    keysDown.remove(e.getKeyCode());}public void updatePaddlePositions(){
    if (keysDown.contains(KeyEvent.VK_W)) 
        paddleOne.move(-PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_S))
        paddleOne.move(PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_UP))
        paddleTwo.move(-PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_DOWN))
        paddleTwo.move(PADDLE_MOVE_INCREMENT);

    try {
        Thread.sleep(DELAY);
    } catch (InterruptedException e) {
        System.out.println("You Interrupted the game!");
    }

    canvas.repaint();}

这是paintComponent方法canvas目的:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    paddleOne.paint(g);
    paddleTwo.paint(g);
    updatePaddlePositions(); // Does this need to be SwingUtilities.invokeLater(this)?
                             // And should updatePaddlePositions() be run() as a result?}

这是paint方法paddleOnepaddleTwo物体:

    public void paint(Graphics g)
    {
        g.setColor(Color.BLACK);
        g.fillRect(x, y, PADDLE_WIDTH, PADDLE_HEIGHT);
    }

如果有什么对你来说是“坏”的东西,请随意评论我的设计。最后,什么是Collections.synchronizedSet(new HashSet<Integer>())刻薄/做?

更新2:键绑定似乎是要走的路(即使在这种情况下,它们需要更多的代码)。是什么使键绑定更好?是因为它们与其他东西分开工作(而不像关键侦听器那样需要窗口焦点)吗?

另外,我知道HashSet<Integer>的子类Set<Integer>,但它的目的是什么呢?Collections.synchronizedSet(...)?我假设它与线程有关,但我不知道为什么这个程序需要它(如果有的话)。


长风秋雁
浏览 420回答 3
3回答

牧羊人nacy

这可能是提供给KeyListener..看见如何编写关键侦听器和KeyEventDemo别忘了requestFocusInWindow()..还可以考虑为一个播放器提供键盘控制,而为另一个播放器提供鼠标控制。

蛊毒传说

我仍然对反常现象感到困惑例我在那里列举了你的例子;颠簸。HashSet<String>是实施的Set<String>..放任getMask()返回aSet<String>,如果需要的话,您可以自由选择不同的实现。打电话的人可能只关心Set而不是它是如何实现的。
打开App,查看更多内容
随时随地看视频慕课网APP