2017-05-31 35 views
1

目前,我有我的事件處理這裏的時候,一個聲音:JavaFX的:播放過的東西被點擊

theScene.setOnMouseClicked(
      new EventHandler<MouseEvent>() { 
       public void handle(MouseEvent e) { 
        if (targetData.containsPoint(e.getX(), e.getY())) { 
         double x = 50 + 400 * Math.random(); 
         double y = 50 + 400 * Math.random(); 
         targetData.setCenter(x, y); 
         mediaPlayer.play(); //play hitsound 
         points.value++; //add points 
        } else { 
         points.value = 0; //miss 
        } 
       } 
      }); 

我也有我的音頻設置,如下所示:

String hitNormal = ("hit.mp3"); 
    Media sound = new Media(new File(hitNormal).toURI().toString()); 
    MediaPlayer mediaPlayer = new MediaPlayer(sound); 

當我運行我的程序,只圓上的第一次點擊播放hitsound,但後面的所有圓圈都不播放聲音。我認爲我上面應該工作,因爲每次我點擊額外的圈子總是會增加分數。因爲我有我的mediaPlayer.play();在與添加分數的線條完全相同的陳述中,我預計聲音也會發揮。每當我點擊圈子時,我該如何讓自己的屁股發揮作用?

編輯:我添加mediaPlayer.stop();在points.value ++之下,它似乎偶爾發揮hitsound,但並非總是如此。

+0

您是否嘗試過使用'mediaPlayer.pause()'呢? – Flaom

+0

我不覺得孤單,需要暫停1秒的音頻剪輯。 你能解釋更多,我可以使用mediaPlayer.pause(); ? – Enkrypton

+0

不好意思,我誤解了這個方法。 – Flaom

回答

1

在你提到的問題評論中,音頻只有第二長。如果是這種情況,使用AudioClip可能比Media/MediaPlayer更適合您的需求。

一個AudioClip可以比在平行一次(允許多個快速命中一次播放聲音)不同於MediaPlayer播放更多。它也可以根據需要多次播放,沒有太多麻煩。

如果你堅持MediaPlayer James_D和TomN似乎是在正確的軌道上。從一些小測試看來,MediaPlayer在達到媒體結束後,並不會簡單地在您撥打play()時重新啓動。造成這種情況的原因是MediaPlayerStatus在媒體完成時沒有從PLAYING更改爲STOPPED。並且由於play()StatusPLAYING時不會執行任何操作,因此它不會重新啓動。

要解決這個問題,您必須首先使用seek(Duration.ZERO)將時間設置爲0,然後致電play()。事實上,在第一次之後,如果您之前任何地方沒有撥打pause()stop(),撥打play()似乎不是必要的。

然而,由於你的音頻是隻有一秒鐘長的我還是建議AudioClip。這門課是根據我所知道的來設計的。

+0

我試過'AudioClip'。使用AudioClip比使用seek(Duration.ZERO)更好,因爲當使用seek(Duration.ZERO)時,我可以感覺到一個小的延遲。 感謝您擴展解決方案! – Enkrypton

0

您需要檢查媒體播放器的狀態,此方法可能有助於mediaPlayer.getStatus()

當它正在播放時,另一個play()方法似乎什麼都不做,因爲它改變了播放狀態,但它已經做到了。看在你的代碼如下方法MediaPlayerMediaPlayer.Status


嘗試使用。

mediaPlayer.stop()它會停止介質並將當前時間重置爲零。

當媒體結束時添加此方法。您可以嘗試如下代碼

mediaPlayer.setOnEndOfMedia(new Runnable() 
{ 
    public void run() 
    { 
     mediaPlayer.stop(); 
    } 
}); 

或使用mediaPlayer.seek()查找當前時間。

當前一個媒體還沒有到達結尾時,您需要暫停它,並在下一個play()之前將當前時間設爲零。