Как заставить MediaPlayer остановиться после того, как объект, который содержал его, был установлен в нуль в Java? - PullRequest
1 голос
/ 20 июня 2019

Я создал класс Sound для своей игры, который содержит MediaPlayer, который зацикливается (в сценарии, в котором возникает проблема).Если для объекта, содержащего объект Sound, задано значение NULL (чтобы удалить его), MediaPlayer продолжает воспроизведение до тех пор, пока не достигнет конца носителя, хотя он должен остановиться, поскольку для него должно быть установлено значение NULL.Или это не так?

Я нашел следующие сообщения в сети, но ни у одного из них не было такой же проблемы, как у меня: Link1 , Link2

Это класс Sound:

public classs Sound {

  MediaPlayer mediaPlayer;

  public Sound(String path){
    Media media = new Media(getClass().getResource("/audio/" + path).toString());
    mediaPlayer = new MediaPlayer(media);
  }

  public void loop(){
    //only called once after initialized
    mediaPlayer.setAutoPlay(true);
    mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
    mediaPlayer.setOnEndOfMedia(new Runnable() {
        @Override
        public void run() {
            mediaPlayer.seek(Duration.ZERO);
            mediaPlayer.play();
        }
    });
    mediaPlayer.play();
  }
}

Это класс, содержащий звук:

public class Level {

    private Sound soundTrack = new Sound("level_music.wav");

    public Level() {
        soundTrack.loop();
    }

Вот как для объекта, содержащего звук, устанавливается значение NULL:

public class Main{

  private Level level = new Level();
  //...
  public Main(){
    new Timer(15, new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {

        if(playerLeavesTheLevel()){
          level = null;
          //...
        }

    }
  }
}

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

1 Ответ

2 голосов
/ 20 июня 2019

Запись level = null означает, что вы указываете ссылку, называемую level, для хранения значения: null.Значение, на которое ранее указывал level, все еще существует (и все еще используется MediaPlayer).level просто больше не указывает на это.Возможно, у MediaPlayer есть метод stop(), который вы можете использовать, чтобы остановить воспроизведение звука, когда проигрыватель меняет уровни?

...