@Override
    public void run() {
        while (_model.isRunning()) {
            long beginTimeMillis, timeTakenMillis, timeLeftMillis;
            beginTimeMillis = System.currentTimeMillis();
            
            if(_model.isResetGame()){
                resetHard();
                for (Ball b : balls) {
                    b.setBallImg(Functions.getBallIMG(_model.getBallChoice()));
                }
                _model.setResetGame(false);
            }

            if (balls.get(0) != null && tm.getGameField() != null) {
                if (_model.isMoving() && !_model.isPause()) {
                    gameUpdate();
                }
            }
            repaint();

            // Draaien op 30 FPS
            timeTakenMillis = System.currentTimeMillis() - beginTimeMillis;
            timeLeftMillis = 1000L / _model.getUPDATE_RATE() - timeTakenMillis;
            if (timeLeftMillis < 5) {
                timeLeftMillis = 5; // Minimum bepaald
            }

            sleep(thread, timeLeftMillis);
        }
    }