I'm attempting to create a simple pong game in Java, but I don't know how to have both players using the keyboard at the same time. The game is incomplete and I'm working on the paddle movement for both players currently. The problem is, when a player pushes their up key and moves their paddle up, but if the other players hits any of their keys it cancels the previous players action and causes the paddle to stop. I think I need a way to handle multiple key inputs at once. Here's my code the KeyListeners at the bottom is where I need help. I'm only a 1 year Java programmer so go easy on the rest of my code.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashSet;
import java.util.Set;
public class DrawGame extends JPanel implements ActionListener{
public static final int XPOS = 0;
public static final int YPOS = 0;
public boolean xFlag = true; // true means ballx is going right
public boolean yFlag = true; // true means bally is going down
public int ballX = 300; // Ball starting point
public int ballY = 400; // Ball starting point
Timer ballTimer; // Starts balls animation
public int leftScore;
public int rightScore;
public int rightPadY; // Right players paddle position
public int leftPadY; // left players paddle position
// Constructor
public DrawGame(){
addKeyListener(new RightListener());
addKeyListener(new LeftListener());
leftScore = 0;
rightScore = 0;
rightPadY = YPOS + 230;
leftPadY = YPOS + 230;
setBackground(Color.BLACK);
setPreferredSize(new Dimension(800, 600));
setFocusable(true);
ballTimer = new Timer(10, this);
ballTimer.start();
}
// Draws game
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
//Drawing Side Boards
g2d.setColor(Color.WHITE);
g2d.fillRect(XPOS + 5, YPOS + 20, 775, 25); // Top Board
g2d.fillRect(XPOS + 5, YPOS + 517, 775, 25); // Bottom board
//Drawing the center line
g2d.fillRect(XPOS + 377, YPOS + 45 * 1, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 2, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 3, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 4, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 5, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 6, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 7, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 8, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 9, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 10, 25, 25);
g2d.fillRect(XPOS + 377, YPOS + 45 * 11, 25, 25);
//Drawing the paddles
g2d.fillRect(XPOS + 10, leftPadY, 20, 100);// Left
g2d.fillRect(XPOS + 755, rightPadY, 20, 100); // Right
//Drawing the ball
g2d.fillRect(ballX, ballY, 23, 23);
//Drawing the score
switch(leftScore){
case 0:
g2d.fillRect(XPOS + 305, YPOS + 50, 7, 30);
g2d.fillRect(XPOS + 325, YPOS + 50, 7, 30);
g2d.fillRect(XPOS + 305, YPOS + 50, 25, 7);
g2d.fillRect(XPOS + 305, YPOS + 80, 27, 7);
break;
case 1:
g2d.fillRect(XPOS + 325, YPOS + 50, 7, 30);
}
switch(rightScore){
case 0:
g2d.fillRect(XPOS + 450, YPOS + 50, 7, 30);
g2d.fillRect(XPOS + 470, YPOS + 50, 7, 30);
g2d.fillRect(XPOS + 450, YPOS + 50, 25, 7);
g2d.fillRect(XPOS + 450, YPOS + 80, 27, 7);
break;
case 1:
g2d.fillRect(XPOS + 450, YPOS + 50, 7, 30);
}
}
// Controls the animation of the ball
public void actionPerformed(ActionEvent e){
if(xFlag == true && ballX >= 735){
ballX += 2;
xFlag = false;
} else if(xFlag == true){
ballX += 2;
}
if(xFlag == false && ballX <= 25){
ballX -= 2;
xFlag = true;
} else if(xFlag == false){
ballX -= 2;
}
if(yFlag == true && ballY >= 500){
ballY += 2;
yFlag = false;
} else if(yFlag == true){
ballY += 2;
}
if(yFlag == false && ballY <= 45){
ballY -= 2;
yFlag = true;
} else if(yFlag == false){
ballY -= 2;
}
repaint();
ballTimer.restart();
}
// Keylistener for right player
private class RightListener implements KeyListener{
@Override
public synchronized void keyPressed(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_UP){
rightPadY -= 5;
}else if(event.getKeyCode() == KeyEvent.VK_DOWN){
rightPadY += 5;
}
repaint();
}
@Override
public synchronized void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public synchronized void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
// Keylistener for left player
private class LeftListener implements KeyListener{
@Override
public synchronized void keyPressed(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_W){
leftPadY -= 5;
} else if(event.getKeyCode() == KeyEvent.VK_S){
leftPadY += 5;
}
repaint();
}
@Override
public synchronized void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public synchronized void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}