Перемещение мяча с помощью клавиш со стрелками с помощью Java-апплета

Я изучаю язык Java и пытаюсь сделать простую игру-лабиринт. Я могу рисовать мяч и объекты на экране, но не могу перемещать мяч с помощью клавиш со стрелками. Вот мой код:

 import java.applet.*;
 import java.awt.*;
 import java.awt.event.KeyEvent;
 import javax.swing.*;
 import java.awt.event.*;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;


public class game extends Applet implements ActionListener, KeyListener {
/**
 * 
 */
private static final long serialVersionUID = 1L;

double x = 0, y = 0;

static int MoveX = 210; 
static int MoveY = 800; 

 public void up(){
        MoveY = -2;
        MoveX = 0;
    }

    public void down(){
        MoveY = 2;
        MoveX = 0;
    }

    public void left(){
       MoveX = -2;
        MoveY = 0;
    }

    public void right(){
        MoveX = 2;
        MoveY = 0;
    }



public void paint(Graphics g){
    //g.drawLine(200+10,150-10, 200+190, 150-10);
    //g.drawLine(200+30,200-30, 200+190, 200-30);
    g.setColor(Color.BLUE);


    g.fillRect(200+10, 150-10, 200+40, 150-10);
    g.fillRect(300+40, 150-10, 300+70, 150-10);


    g.fillRect(200+10, 200-10, 200+10, 200-10);
    g.fillRect(200+10, 230-10, 200+10, 230-10);
    g.fillRect(200+10, 260-10, 200+10, 260-10);
    g.fillRect(200+10, 290-10, 200+10, 290-10);
    g.fillRect(200+10, 320-10, 200+10, 320-10);
    g.fillRect(200+10, 350-10, 200+10, 350-10);
    g.fillRect(200+10, 380-10, 200+10, 380-10);




    g.fillRect(600+300, 90-10, 100+100, 150-10);
    g.fillRect(600+300, 150-10, 100+100, 210-10);
    g.fillRect(600+300, 210-10, 100+100, 270-10);
    g.fillRect(600+300, 270-10, 100+100, 330-10);


    g.fillRect(600+100,400, 200, 180);
    g.fillRect(600+30,400, 200, 180);


    g.fillRect(1000+300, 90-10, 100+100, 150-10);
    g.fillRect(1000+300, 150-10, 100+100, 210-10);
    g.fillRect(1000+300, 210-10, 100+100, 270-10);
    g.fillRect(1000+300, 270-10, 100+100, 330-10);
    g.fillRect(1000+300, 330-10, 100+100, 390-10);
    g.fillRect(1000+300, 390-10, 100+100, 350-10);

    g.setColor(Color.RED); 
    int size =90;
    g.fillOval(MoveX, MoveY, size, size); 






}
public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
     int code = e.getKeyCode();

        if (code == KeyEvent.VK_UP){
            up();
        }

        if (code == KeyEvent.VK_DOWN){
            down();
        }

        if (code == KeyEvent.VK_LEFT){
            left();
        }

        if (code == KeyEvent.VK_RIGHT){
            right();
        }

}
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

    int code = e.getKeyCode();

    if (code == KeyEvent.VK_UP){
        MoveY = 0;
    }
    if (code == KeyEvent.VK_DOWN){
        MoveY = 0;
    }
    if (code == KeyEvent.VK_LEFT){
        MoveX = 0;
    }
    if (code == KeyEvent.VK_RIGHT){
        MoveX = 0;
    }

}
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
     repaint();
        x += MoveX;
        y += MoveY;

        if (x<0){
            MoveX = 0;
            x = 0;
        }

        if (x>750){
            MoveX = 0;
            x = 750;
        }

        if (y<0);{
            MoveY = 0;
            y = 0;
        }

        if (y>550){
            MoveY = 0;
            y = 550;
        }
   }


  }

Апплет успешно запустился, и объекты нарисованы. Я нажимал клавиши со стрелками, но мяч не двигался. Как я могу запустить методы KeyListener?

Большое спасибо!

1) Зачем кодировать апплет? Если это связано с указанием учителя, отошлите его к Почему учителям CS следует останавливаться обучать Java-апплетам. 2) См. Поддержка подключаемого модуля Java устарела и Переход на Интернет без плагинов. 3) Зачем использовать AWT? ..

Andrew Thompson 02.05.2018 15:10

.. См. этот ответ по множеству веских причин отказаться от компонентов AWT в пользу Swing.

Andrew Thompson 02.05.2018 15:10

@AndrewThompson Это моя домашняя работа. Я студент компьютерной инженерии. Кстати, ссылку на статью я пришлю своему профессору :)

teraRockstar 02.05.2018 20:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
1 080
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам необходимо установить ключевой прослушиватель на вашем экземпляре апплета:

public void init() {
    addKeyListener(this);
}

Однако ничего не произойдет, потому что вы не перекрашиваете свой апплет. После того, как пользователь нажмет клавишу, вам нужно будет перерисовать:

repaint();

Логика для ваших функций up(), down() и т. д. Также неверна. Когда вы вызываете функцию up(), положение мяча будет установлено на 0, -2, когда вы вызываете функцию down(), положение мяча будет установлено на 0,2. Вы должны корректировать существующее положение шара, а не устанавливать его на фиксированные координаты.

Обратите внимание, что Applet (по умолчанию) не фокусируется. У него не обязательно будет фокус ввода, даже если он является фокусируемым сделал. Оба они необходимы апплету для получения ключевых событий. Итак, этот ответ, сам по себе,, исправит нет сообщенную проблему.

Andrew Thompson 02.05.2018 15:08
Ответ принят как подходящий

Я решил проблему. Вот ссылка на код:

Мини-лабиринт

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