如何同时收听多个键输入

SHI*_*EAD 2 java swing

我正在尝试用Java创建一个简单的乒乓球游戏,但我不知道如何让两个玩家同时使用键盘.游戏不完整,我正在为两位玩家进行划桨运动.问题是,当玩家按下他们的向上键并向上移动他们的牌时,但如果其他玩家击中他们的任何键,它会取消之前的玩家动作并导致击球板停止.我想我需要一种方法来同时处理多个键输入.这是我的代码,底部的KeyListeners是我需要帮助的地方.我只是一个1年的Java程序员,所以在我的其余代码上轻松一点.

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

        }
    }




}
Run Code Online (Sandbox Code Playgroud)

cam*_*ckr 6

不要使用KeyListener.你应该使用Key Bindings.

有关详细信息,请参阅使用键盘进行运动

KeyboardAnimation在以上链接的示例中添加了以下代码,这将允许您执行您想要的操作:

JLabel label2 = new JLabel( new ColorIcon(Color.GREEN, 40, 40) );
label2.setSize( label2.getPreferredSize() );
label2.setLocation(500, 500);
contentPane.add( label2 );

KeyboardAnimation animation2 = new KeyboardAnimation(label2, 24);
animation2.addAction("A", -3,  0);
animation2.addAction("D", 3,  0);
animation2.addAction("W",    0, -3);
animation2.addAction("S",  0,  3);
Run Code Online (Sandbox Code Playgroud)