Одновременная обработка нажатия клавиш (Java)? - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь сделать игру для пинг-понга для 2 игроков. Вот мой текущий код. Пока все хорошо, но моя проблема в том, что всякий раз, когда я нажимаю A или D (которые являются элементами управления игрока 1) левым или правым (элементы управления игрока 2), программа не может зарегистрировать оба и будет принимать команду только от одного из них. Мне нужно, чтобы оба игрока могли двигаться одновременно. Я попробовал логический подход (при каждом ключе переключать логическое значение), но также представляет ту же проблему. Я что-то упустил в KeyListeners?

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Mechanism extends JPanel implements KeyListener, ActionListener {

    private boolean A,D,L,R;

    private int p1_posX = 250;
    private int p1_score;


    private int p2_posX = 250;
    private int p2_score;

    private Timer timer;
    private int delay = 10;


    private int ball_posX = 250;
    private int ball_posY = 450;

    private int ball_dirX;
    private int ball_dirY;

    public Mechanism() {
        addKeyListener(this);
        setBackground(Color.black);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        timer = new Timer(delay, this);
        timer.start();

    }

    public void paint(Graphics g) {
        //background
        g.setColor(Color.black);
        g.fillRect(0, 0, 600, 900);

        //ball 
        g.setColor(Color.white);
        g.fillOval(ball_posX, ball_posY, 15, 15);

        //left border
        g.setColor(Color.white);
        g.fillRect(0, 0, 10, 900);

        //right border
        g.setColor(Color.white);
        g.fillRect(584, 0, 10, 900);

        //player 1 (top)
        g.setColor(Color.white);
        g.fillRect(p1_posX, 50, 95, 10);

        //player 2 (bot)
        g.setColor(Color.white);
        g.fillRect(p2_posX, 820, 95, 10);

        g.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        timer.start();
        repaint();

    }
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_A) {
            if (p1_posX <= 10) {
                p1_posX = 10;

            }
            else {
                p1_posX -= 20;

            }
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            if (p1_posX >= 584) {
                p1_posX = 584;
            }
            else {
                p1_posX += 20;
            }
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            if (p2_posX <= 10) {
                p2_posX = 10;

            }
            else {
                p2_posX -= 20;

            }
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            if (p2_posX >= 584) {
                p2_posX = 584;
            }
            else {
                p2_posX += 20;
            }
        }
        if (e.getKeyCode() == KeyEvent.VK_END) {

        }

    }


    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
}
...