为了账号安全,请及时绑定邮箱和手机立即绑定

带键绑定的线程

带键绑定的线程

我对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方法paddleOne和paddleTwo物体:    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(...)?我假设它与线程有关,但我不知道为什么这个程序需要它(如果有的话)。
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-07-13
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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

查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 419 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信