Использование KeyListener с Thread для управления изображением

Я пытаюсь создать анимацию ходьбы. Он должен чередоваться между playerLeft и playerLeftWalk. Код показан ниже:

public class MyClass extends JPanel implements ActionListener, KeyListener{
    protected Timer tm = new Timer(10, this);
    protected Clip clip;
    protected Image background, playerSprite, playerLeft, playerLeftWalk;
    protected int mapdx = 0;
    protected int mapdy = 0;
    protected int mapX = 0;
    protected int mapY = 0;
    protected int playerX = 1060;
    protected int playerY = 2800;
    protected volatile boolean activeThread;

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(this.background, this.mapX + this.mapdx, this.mapY - this.mapdy, this);
        g.drawImage(this.playerSprite, this.playerX, this.playerY, this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        mapX += mapdx;
        mapY += mapdy;
        this.repaint();             
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int k = e.getKeyCode();

        Thread playerControl=null;
        if (!activeThread) {
            this.activeThread=true;
            playerControl = new Thread(new Runnable() {
                @Override
                public void run() {
                    switch (k) {
                    case KeyEvent.VK_LEFT:
                        mapdx = 1;
                        mapdy = 0;
                        System.out.println("Map X: " + mapX + " Map Y: " + mapY);
                        try {
                            playerSprite = playerLeftWalk;
                            Thread.sleep(250);
                            playerSprite = playerLeft;
                        } catch (InterruptedException e) {
                        }
                        break;

                    default:
                        break;
                    }
                }
            });
            activeThread=false;
        }   
        if(playerControl!=null)
            playerControl.start();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int k = e.getKeyCode();
        if(k == KeyEvent.VK_LEFT) {
            mapdx = 0;
            mapdy = 0;
            playerSprite = playerLeft;
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }
}

Приведенный выше код работает в течение первого «цикла», а затем заикается. Я предполагаю, что происходит то, что создается несколько потоков, из-за чего изображение заикается.


person Razonixx    schedule 30.10.2017    source источник
comment
Как правило, KeyListener — плохой выбор, используйте привязки клавиш вместо этого API. Вместо использования таких потоков у вас должен быть основной цикл, который обрабатывает ключевые состояния и обновляет состояние модели того, что вы пытаетесь визуализировать, затем он должен отображать выходные данные.   -  person MadProgrammer    schedule 30.10.2017
comment
Проверим их, спасибо!   -  person Razonixx    schedule 30.10.2017