我对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(...)?我假设它与线程有关,但我不知道为什么这个程序需要它(如果有的话)。
添加回答
举报
0/150
提交
取消