Как исправить Java прослушиванием более 1 ключа одновременно? - PullRequest
0 голосов
/ 12 июня 2019

Я и мой партнер пытаемся создать игру Pong для нашего финального проекта по информатике.Мы создали ссылочный код, в котором 2 куба могут управляться вверх и вниз, и это прекрасно работает.Проблема возникает при попытке контролировать оба куба одновременно (одновременно перемещается только 1 куб).Мы хотим, чтобы оба куба двигались одновременно.

Мы хотим сказать, что:

yPos - is the y position of the black cube 
xPos - is the x position of the black cube 
xPos2 - is the x position of the blue cube
YPos2 - is the y position of the blue cube

Ключи:

A - Go up for black cube
Z - Go down for black cube
K - Go up for blue cube
M - go down for blue cube

Мы пытались использовать болеесложная версия, которая использовала анимацию j-label.Как бы мы ни хотели сделать нашу игру понг с помощью графической функции.Но мы не понимаем:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class PongHelpNeed extends JFrame implements KeyListener
{
  // booleans to tell which key is pressed
  boolean upKey;
  boolean downKey;
  boolean upKey2;
  boolean downKey2;

  // the position variables
  int yPos;           
  int xPos; 
  int xPos2;
  int yPos2;

  public PongHelpNeed ()
  {
    //create window
    super ("Controller");
    setSize (660, 700);

    // set keys to false and original positions
    upKey = false;
    downKey = false;

    upKey2 = false;
    downKey2 = false;

    xPos = 100;
    yPos = 350;

    xPos2 = 500;
    yPos2 = 350;

    // add the frame as a listener to your keys
    addKeyListener (this);  
    // Show the frame
    setVisible(true);       
  }

  //needs to be here because the class implements KeyListener
  public void keyTyped (KeyEvent e)       
  {
    System.out.println (e.getKeyCode () + " Typed");
  }

  //needs to be here because the class implements KeyListener
  public void keyPressed (KeyEvent e) {
    //check if keys a,z or k,m are pressed

    if  (e.getKeyCode () == KeyEvent.VK_A) 
    {
      upKey = true;
    }
    else if (e.getKeyCode () == KeyEvent.VK_Z) 
    {
      downKey = true;
    }
    else if (e.getKeyCode () == KeyEvent.VK_K) 
    {
      upKey2 = true;
    }
    else if (e.getKeyCode () == KeyEvent.VK_M) 
    {
      downKey2 = true;
    }
    //repaint the window everytime you press a key
    repaint ();   
  } 

  //needs to be here because the class implements KeyListener
  public void keyReleased (KeyEvent e) 
  {
    System.out.println (e.getKeyCode () + " Released");
  }

  //paints the pictures 
  public void paint (Graphics g)   
  {
    //set background
    g.setColor(Color.WHITE);  
    g.fillRect(0, 0, 660, 700);

    //cube 1
    g.setColor(Color.BLACK);      
    g.fillRect(xPos,yPos,50, 50);

    //draw cube 2
    g.setColor(Color.BLUE);    
    g.fillRect(xPos2,yPos2, 50, 50);

    //if keys are pressed move the cubes accordingly up or down
    if (upKey == true)
    {
      yPos = yPos - 15;
      upKey = false;
    }

    else if (downKey == true)
    {
      yPos = yPos + 15;
      downKey = false;
    }
    else if (downKey2 == true){
      yPos2 = yPos2 + 15;
      downKey2 = false;
    }
    else if (upKey2 == true)  {
      yPos2 = yPos2 - 15;
      upKey2 = false;
    }   
  }

  public static void main (String[] args) 
  {
    new PongHelpNeed (); 
  }
} 

Наши ожидаемые результаты - мы пытаемся переместить оба куба одновременно.Поэтому, когда мы нажимаем клавишу A и клавишу K, черный квадрат должен двигаться, а синий кубик должен двигаться.

1 Ответ

0 голосов
/ 12 июня 2019

Вызов repaint() не запускает вызов на paint немедленно, поэтому вполне возможно, что keyPressed будет запущен дважды (или более) до paint.

В вашем paintМетод проверки ключей в if-else, что означает, что если один из флагов имеет значение true, остальные не проверяются.У вас также есть состояние гонки, когда keyPressed сражается с paint над флагами.Кроме того, если вы быстро нажмете клавишу несколько раз, вы потеряете все дополнительные нажатия клавиш между первым обработанным событием и следующей перерисовкой.

Вместо перемещения в paint, вы должны сделать этов обработчике keyPressed.Не устанавливайте флаг, например, upKey = true;, но вместо этого выполняйте действие напрямую: yPos = yPos - 15;.Затем метод paint просто обновит представление, чтобы отразить текущее (обновленное) состояние.

...