Объект не будет появляться при нажатии клавиш в java swing - PullRequest
0 голосов
/ 18 декабря 2018

Итак, я пытаюсь сделать очень простую игру на Java с использованием свинга.Это игра типа космических захватчиков, и я успешно запрограммировал космический корабль, который двигается влево и вправо нажатием клавиш.Однако у меня много проблем с отображением «выстрела».

Я пока не собираюсь его позиционировать, я просто хочу создать объект при нажатии клавиш, чтобы он работал.Я предполагаю, так как это изначально не в методе «рисования», поэтому он не появляется.Но я не знаю, как это сделать!Есть идеи?

Для справки приведем текущий код:

public void keyPressed(KeyEvent e) {
    if (KeyEvent.VK_RIGHT == e.getKeyCode()) {
        moveRight();
    }
    if (KeyEvent.VK_LEFT == e.getKeyCode()) {

        moveLeft();
    }
    if (KeyEvent.VK_SPACE == e.getKeyCode()) {
        shoot();

    }
}

public void shoot() {
    Laser laser = new Laser(new Point(200, 200));
    this.repaint();
}

public void moveLeft() {
    if (player.getCentre().getX() <= 20) {
        player.setX(20);
    } else {
        double movement = player.getCentre().getX();
        movement -= 10;
        player.setX(movement);
    }
    this.repaint();
}

@Override
public void paint(Graphics g) {
    setBackground(Color.black);
    super.paint(g);
    player.draw(g);

}

Я просто хочу, чтобы Shot () успешно создал объект и показал его на моей панели!

1 Ответ

0 голосов
/ 18 декабря 2018

Проблемы / Предложения:

  • Ваш метод съемки прекрасно создает объект, но затем полностью его игнорирует.Вы не добавляете свой вновь созданный объект Laser ни к чему, ни к полю класса, ни к какому-либо ArrayList, и ни к какой-либо другой коллекции, поэтому класс не будет знать, что объект существует, и однажды метод, гдеего создание заканчивается, объект подготовлен для сбора мусора, поскольку он существует только локально в методе.
  • Мы не знаем, работает ли ваш KeyListener или нет.Вы отлаживали эту часть с помощью операторов println?Если бы не я, я бы сделал это.
  • Я бы вообще не использовал KeyListener в пользу Связывания клавиш , так как последний намного менее нервный в отношении требований к фокусу
  • Какобщее правило, не переопределяйте метод рисования JPanel, а скорее его метод paintComponent, и обязательно вызовите метод super в пределах вашего переопределения.
  • Ваш графический интерфейс будет рисовать только то, что вы говорите, чтобы рисовать, и в настоящее времяВаш метод рисования требует только нарисовать состояние игрока, но не более того.Если вы хотите, чтобы лазерный взрыв был нарисован, то метод рисования, который снова должен иметь переопределение protected void paintComponent(Graphics g), а не public void paint(Graphics g), должен содержать код для этого.

Мы немного ограничены в любых советах, которые мы можем дать, поскольку вы опубликовали фрагмент кода, который мы не можем скомпилировать или запустить.Если эти предложения не приведут вас к ответу, пожалуйста, создайте и опубликуйте небольшую, но простую полную программу, иллюстрирующую вашу проблему, MCVE .Пожалуйста, проверьте ссылку для деталей этого очень полезного инструмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...