在KeyEvents上需要帮助



简单的问题。我在尝试重现Pong游戏。我在屏幕上有我想要的图形用KeyEvents移动两个操纵杆。我唯一的问题是,当我释放一个键时,另一个桨也停止了(如果两者同时移动),我知道为什么会发生这种情况,但无法找出解决办法。这是因为当keyrelease方法被调用时,两个桨都被设置为速度0。我怎么能编码它不同的地方,我可以移动/停止两个桨分别与keyReleased方法?

代码:

package pong.main;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PongGame extends JPanel implements ActionListener,KeyListener {
private final int WIDTH = 750;
private final int HEIGHT = 750;
private int DELAY = 20;
private int IMAGE_SIZE = 35;
private ImageIcon paddle_one;
private ImageIcon paddle_two;
private ImageIcon pong_logo;
private ImageIcon pong_ball;
private Timer timer = new Timer(DELAY, this);
private int p1_x = 10;
private int p1_y = 325;
private int p2_x = 710;
private int p2_y = 325;
private int p1_moveX;
private int p1_moveY;
private int p2_moveX;
private int p2_moveY;
public PongGame(){
    timer.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    paddle_one = new ImageIcon("C:\Users\Bryan\Pictures\paddle.gif");
    paddle_two = new ImageIcon("C:\Users\Bryan\Pictures\paddle.gif");
    pong_logo = new ImageIcon("C:\Users\Bryan\Pictures\pong_logo.gif");
    pong_ball = new ImageIcon("C:\Users\Bryan\Pictures\pong_ball.gif");
    setPreferredSize(new Dimension(WIDTH, HEIGHT));
    setBackground(Color.black);
}
public void paintComponent(Graphics g){
    super.paintComponent(g);
    paddle_one.paintIcon(this, g, p1_x, p1_y);
    paddle_two.paintIcon(this, g, p2_x, p2_y);
    pong_ball.paintIcon(this, g, 350, 350);
    pong_logo.paintIcon(this, g, 220, -100);
}
public void actionPerformed(ActionEvent e){
    repaint();
    p1_x += p1_moveX;
    p1_y += p1_moveY;
    p2_x += p2_moveX;
    p2_y += p2_moveY;
}
public void paddle_one_up(){
    p1_moveX = 0;
    p1_moveY = -5;
}
public void paddle_one_down(){
    p1_moveX = 0;
    p1_moveY = 5;
}
public void paddle_two_up(){
    p2_moveX = 0;
    p2_moveY = -5;
}
public void paddle_two_down(){
    p2_moveX = 0;
    p2_moveY = 5;
}
public void keyPressed(KeyEvent e){
    int code = e.getKeyCode();
    if(code == KeyEvent.VK_W){
        paddle_one_up();
    }
    if(code == KeyEvent.VK_S){
        paddle_one_down();
    }
    if(code == KeyEvent.VK_UP){
        paddle_two_up();
    }
    if(code == KeyEvent.VK_DOWN){
        paddle_two_down();
    }
}
public void keyReleased(KeyEvent e){
    int code = e.getKeyCode();
    if(code != KeyEvent.VK_W){
        p1_moveX = 0;
        p1_moveY = 0;
    }
    if(code != KeyEvent.VK_S){
        p1_moveX = 0;
        p1_moveY = 0;
    }
    if(code != KeyEvent.VK_UP){
        p2_moveX = 0;
        p2_moveY = 0;
    }
    if(code != KeyEvent.VK_DOWN){
        p2_moveX = 0;
        p2_moveY = 0;
    }
public void keyTyped(KeyEvent e){}
}
    看看你的keyPressed方法和keyReleased方法之间的区别。
  1. 在keyrelease中做类似的事情——检查KeyEvent对象的键代码并相应地执行。这两种方法之间的差异和您无法解决这个问题表明您的keyPressed代码是借来的代码。借用代码是可以的,只要你先理解它。最好是借鉴别人的想法,然后编写自己的代码。
  2. 甚至更好——使用键绑定,这是一个比使用KeyListeners更安全,更好的解决方案。

使用keyPressed()方法的条件逻辑结构,您需要在keyReleased()中进行类似的检查,以确定在设置两个桨的速度之前释放了哪个键。实际上,您可以释放任意键,keyReleased()将p1和p2的值赋值为零。

最新更新