我對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
提交
取消