在 Java 中将包含它的对象设置为 null 后,如何使 MediaPlayer 停止?
How to make a MediaPlayer stop after the object that contained it was set to null in Java?
我为我的游戏创建了一个 Sound
class,其中包含一个循环播放的 MediaPlayer(在出现问题的场景中)。如果包含 Sound 对象的对象设置为 null(以将其删除),则 MediaPlayer 会继续播放,直到它到达媒体的末尾,尽管它应该停止,因为它应该已设置为 null。或者这不是它的工作原理?
我在网上找到了以下帖子,但是其中none个和我有同样的问题:Link1, Link2
这是Sound
class:
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();
}
}
这是包含class的声音:
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 未设置为 null。
写 level = null
意味着您要告诉一个名为 level
的引用来保存值:null
。 level
之前指向的值仍然存在(并且仍在被 MediaPlayer
使用)。 level
只是不再指向它了。也许 MediaPlayer
有一个 stop()
方法,你可以使用它在玩家改变级别时停止播放声音?
我为我的游戏创建了一个 Sound
class,其中包含一个循环播放的 MediaPlayer(在出现问题的场景中)。如果包含 Sound 对象的对象设置为 null(以将其删除),则 MediaPlayer 会继续播放,直到它到达媒体的末尾,尽管它应该停止,因为它应该已设置为 null。或者这不是它的工作原理?
我在网上找到了以下帖子,但是其中none个和我有同样的问题:Link1, Link2
这是Sound
class:
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();
}
}
这是包含class的声音:
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 未设置为 null。
写 level = null
意味着您要告诉一个名为 level
的引用来保存值:null
。 level
之前指向的值仍然存在(并且仍在被 MediaPlayer
使用)。 level
只是不再指向它了。也许 MediaPlayer
有一个 stop()
方法,你可以使用它在玩家改变级别时停止播放声音?