Java: пока Loop подавляет функцию рисования JFrame - PullRequest
0 голосов
/ 02 октября 2018

Я создаю собственный движок для подземелья.У меня есть работающий KeyLogger, который может обнаруживать нажатия клавиш с помощью KeyListener.

У меня также есть JFrame c и функция paint () внутри движка, который генерирует кадр и сообщает c repaint ().В-третьих, у меня есть функция move (), которая изменяет координаты игроков в зависимости от нажатых клавиш.

KeyListener:

KeyListener kl = new KeyListener() {

    @Override
    public void keyPressed(KeyEvent k) {

        if (k.getKeyChar() == 'w') {
            my = 1;
        } else if (k.getKeyChar() == 's') {
            my = -1;
        }

        if (k.getKeyChar() == 'a') {
            mx = 1;
        } else if (k.getKeyChar() == 'd') {
            mx = -1;
        }

    }

    @Override
    public void keyReleased(KeyEvent k) {

        if (k.getKeyChar() == 'w' || k.getKeyChar() == 's') {
            my = 0;
        }

        if (k.getKeyChar() == 'a' || k.getKeyChar() == 'd') {
            mx = 0;
        }
    }

};

move ():

void move() {

    System.out.println("Moving by x: " + mx + " y: " + my);
    player.move(10 * mx, 10 * my);
    paint();

}

и функция paint ():

public void paint() {


    System.out.println("Paint Engine");

    Graphics g = Frame.getGraphics();

    //Generate Frame

    c.repaint();


}

Класс, который все это выполняет, называется setup:

public void setup() {

    LevelGen lg = new LevelGen();
    c.addKeyListener(kl);

    lg.generateLevel(0);

    walls = lg.getWalls();
    player = lg.getPlayer();

    paint(); // does not get executed with the while-loop but without

    while(true){ //Please sebd help
        move();
        paint();

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Если я добавлю команды move () и paint ()в KeyListener или в основной функции класса все работает как шарм, но если он помещен в цикл while (true) либо в основную функцию, либо в новый поток, ни KeyStrokes не будут обнаружены, ни команда paint () перед выполнено получение цикла / потока.

Я также пытался удалить Thread.sleep, но это абсолютно ничего не меняет.Вкратце: Alt + F4 также перестает работать, когда петля добавляется каким-либо образом.

Я застрял в этой проблеме в течение последних 6 с половиной часов, так что скоро я могу сойти с ума.

...