Нужна помощь на KeyEvents

Простой вопрос Я пытаюсь заново создать игру Pong. У меня есть графика, которую я хочу на экране с двумя веслами, движущимися с KeyEvents. Моя единственная проблема заключается в том, что когда я отпускаю одну клавишу, другая лопасть также останавливается (если оба движутся одновременно), я точно знаю, почему это происходит, но не могу понять, как это исправить. Это происходит потому, что когда вызывается метод keyReleased, обе лопасти устанавливаются на скорость 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){}

}

2 ответа

  1. Посмотрите на разницу между вашим методом keyPressed и вашим методом keyReleased.
  2. Сделайте аналогичное в keyReleased - проверьте код ключа объекта KeyEvent и действуйте соответствующим образом. Различия между этими двумя методами и неспособность решить эту проблему позволяют предположить, что ваш код keyPressed является заимствованным кодом. Можно заимствовать код, если вы понимаете его первым. Лучше позаимствовать идеи, а затем написать свой собственный код.
  3. Еще лучше - используйте Key Bindings, который является более безопасным и лучшим решением, чем KeyListeners.

Используя структуру вашего keyPressed() условная логика метода, вам нужна аналогичная регистрация в keyReleased() чтобы определить, какая клавиша была отпущена, прежде чем установить скорость любого весла. Как это, вы можете отпустить любой ключ и keyReleased() присвоит значения p1 и p2 нулю.

Другие вопросы по тегам