【问题标题】:Sound stops working after pressing a key 53 times按键 53 次后声音停止工作
【发布时间】:2019-08-04 20:23:02
【问题描述】:

我正在使用 JavaFX(类似于 Space Invaders)创建一个游戏,但我遇到了射击声音的问题,特别是当我多次按下一个键时,不仅声音停止播放,而且其他声音也停止播放工作。

我做了一些小研究,似乎这种问题相当流行,它涉及释放 MediaPlayer 对象/实例,但我不能调用该方法(?)。

我尝试过使用 dispose() 方法,但它完全禁用了拍摄声音。

我有两个类,GameApp:

primaryStage.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                if (event.getCode() == KeyCode.SPACE && playable) {
                    Audio.playPlayerShotSound();
                }
            }
        });

和音频:


public class Audio {

    private static Media shot = new Media(new File("resources/playerShot.wav").toURI().toString());

    public static void playPlayerShotSound() {
        MediaPlayer shotSound = new MediaPlayer(shot);
        shotSound.setVolume(0.2);
        shotSound.play();
    }

我使用 JavaFX 创建了另一个类,按 Space 64 次后声音停止。


package examples;

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.scene.layout.Pane;
import java.io.File;

public class GameInst extends Application {

    Pane root;

    private AnimationTimer timer;
    private static Media shot = new Media(new File("resources/playerShot.wav").toURI().toString());
    int count = 0;

    private Parent createContent() {
        root = new Pane();
        root.setPrefSize(500, 500);


        timer = new AnimationTimer() {
            @Override
            public void handle(long now) {
                onUpdate();
            }
        };
        AnimationTimer timer = new AnimationTimer() {
            @Override
            public void handle(long now) {
                onUpdate();
            }
        };
        timer.start();

        return root;
    }

    private void onUpdate() {
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        root = new Pane();

        primaryStage.setTitle("Space Invaders");
        primaryStage.setScene(new Scene(createContent()));

        primaryStage.getScene().setOnKeyPressed(event -> {
            switch (event.getCode()) {
                case SPACE:
                    MediaPlayer shotSound = new MediaPlayer(shot);
                    shotSound.setVolume(0.1);
                    shotSound.play();
                    count++;
                    System.out.println(count);
            }
        });
        primaryStage.show();
    }

        public static void main (String[] args){
            launch(args);
        }
    }


【问题讨论】:

  • @kleopatra 嘿,我编辑了我的帖子,添加了另一个简单的类。我不知道这是否是你所问的,但它几乎复制了我的问题。
  • 酷,谢谢 :) 下次我在真正的计算机上(现在在移动设备上)时会尝试一下。..计时器与您想要做什么有什么关系?为什么有两个,只从最后一个开始?
  • @kleopatra 实际上它们可能根本不相关 :D 事实上,我是一个新手,所以我记得复制了代码的那一部分,然后没有真正考虑它。感谢您提出这个问题!

标签: javafx audio


【解决方案1】:

对于您正在尝试做的事情,AudioClip 类可能更适合作为成熟的 MediaPlayer。每次收到事件时初始化一个新播放器也可能不是一个好主意。

【讨论】:

  • 谢谢,我想我只需要使用 AudioClip 而不是 MediaPlayer 来重写代码:)
  • @yomi 您的问题可能与您创建新的 MediaPlayer 实例(如答案中所述)并且在它们完成后从不调用 MediaPlayer#dispose() 的事实有关。不过,最好还是重用 MediaPlayer 实例。 AudioClip 也是如此(我同意这可能是适合您情况的更好选择)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多