当前位置: 首页 > 面试题库 >

如何同时收听多个按键输入

巫马心水
2023-03-14
问题内容

我正在尝试用Java创建一个简单的Pong游戏,但我不知道如何让两个玩家同时使用键盘。游戏尚不完整,我目前正在为两位玩家进行划桨动作。问题是,当一个玩家按下自己的向上键并向上移动其拨片时,但是如果其他玩家按下其任意键,则会取消先前的玩家动作并导致拨片停止。我想我需要一种同时处理多个键输入的方法。这是我的代码,底部的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

        }
    }




}

问题答案:

不要使用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);


 类似资料:
  • 问题内容: 我有以下方法可以在Angular中捕获按键: 我听着 但是,我想检测何时同时按下两个键,例如和同时按下(不是一个一个又一个又一个的组合)。 最好的方法是什么? 编辑 我当时想的是: 因此,如果我有多个按键,那么我将创建正确的。但是,问题在于,现在顺序很重要(即,如果我按then ,则按is ;如果我按另一种方式按,则得到) 问题答案: 我认为广播使用过多。而是使用自定义指令?这是一个用

  • 问题内容: 在不使用焦点侦听技术的情况下,java gui中捕获Tab键的最简单方法是什么? 问题答案: VK_TAB 是制表符常量。 然而: 请参阅:http : //docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html 要解决此问题,请将以下内容应用于触发关键事件的组件(例如,TextArea): 使用此方法,然后必须显

  • 问题内容: 我需要设计一个有两个玩家的游戏。每个人都有一个球,应该能够左右移动球,第一个球员带有’a’‘d’按钮,第二个球员带有右,左箭头按钮。但是,当前一名球员需要等待另一名球员的动作完成才能移动自己的球。我该如何解决这个问题?这是我的代码的相关部分: 问题答案: 您需要使用一系列标志和某种“更新”循环来根据标志的状态来更新游戏的状态… 例如,首先创建一系列标志… 这些可以由单个播放器对象轻松维

  • 问题内容: 我有一个霍尼韦尔扫描仪,在扫描条形码时会输出文本。我可以将其用作文本输入的“键盘”,这非常方便,因为我无需进行任何接口。但是它的缺点是必须集中输入并显示移动设备的虚拟键盘,这对于我正在从事的项目是不可接受的。 有什么方法可以在不集中输入的情况下扫描值?我相信,侦听keyPress事件或类似事件将是解决问题的方法,将输入的值存储在textInput之外的其他变量中。 如果有更好的方法可以

  • 正如标题所说,我想检测多个键盘键同时(同时)按下和正在(同时)按下一段时间。我试图在上添加多个事件处理程序,但不起作用: 但是,当用户同时按[]和[]并保持按下时,上面的两个操作必须同时发生,而不仅仅是其中一个。

  • 问题内容: 我想绑定以在按下时关闭活动的反应引导弹出窗口。这是代码 但是,当我按任意键时,控制台中都不会记录任何内容。我也尝试在窗口上以及不同情况下使用’keypress’,’keyup’等来收听,但似乎我做错了。 问题答案: 您应该使用而不是。 Keypress通常仅用于根据文档产生字符输出的键 按键 当按下某个键时会触发keypress事件,并且该键通常会产生一个字符值 按键 按下键时会触发k