JavaFX 2 GameTutorial第5部分
這是與JavaFX 2 Game Tutorial相關(guān)的六部分系列的第五部分。 我知道自從我寫關(guān)于游戲的博客以來(lái)已經(jīng)很長(zhǎng)時(shí)間了,但希望您仍然與我在一起。 如果您想回顧一下,請(qǐng)閱讀第1部分 , 第2 部分 , 第3 部分和第4 部分 ,以了解我們從哪里結(jié)束。 如果您是最新的,那就開始吧! 在此博客文章中,我們將聲音整合到我們的游戲中。
| 圖1:JavaFX Sound FX |
有許多元素可以使游戲變得異常有趣,例如動(dòng)畫效果,碰撞,AI和輸入。 但是, 聲音是游戲最重要的要素之一。 當(dāng)游戲?qū)⒙曇粜Ч鸵魳?lè)融為一體時(shí),玩家將沉浸其中(嗯……就像沒(méi)有意識(shí)到自己即將看到太陽(yáng)升起一樣)。 在詳細(xì)介紹之前,讓我為您介紹一些家用電腦PC游戲中使用的聲音的背景歷史。 如果您想跳過(guò)歷史并開始工作,請(qǐng)?zhí)痢奥曇艄芾砥鞣?wù)”部分。 聲音管理器服務(wù)負(fù)責(zé)維護(hù)游戲期間使用的聲音資產(chǎn)。 如果您真的急躁并且不關(guān)心實(shí)現(xiàn)細(xì)節(jié),請(qǐng)?zhí)痢?JavaFX Sound Demo”。 重要說(shuō)明: 在啟動(dòng)演示之前,請(qǐng)記住閱讀要求。
歷史
如果您想今天了解,則必須昨天進(jìn)行搜索。 ?珍珠巴克
早在我長(zhǎng)大的那一天,我就知道Apple []計(jì)算機(jī)可以播放聲音。 Apple []的揚(yáng)聲器只能產(chǎn)生簡(jiǎn)單的音調(diào)(8位單聲道聲音)。 當(dāng)我第一次發(fā)出聲音(瑪麗有只小羊羔)時(shí),我完全感到驚訝。 如果您對(duì)使用Applesoft Basic的peek和poke命令編寫音樂(lè)的機(jī)器代碼感興趣,請(qǐng)?jiān)L問(wèn)8位Sound and Fury 。 即使8位看起??來(lái)非常簡(jiǎn)單(因?yàn)橹堤?#xff09;,但事實(shí)并非如此。 在為游戲創(chuàng)建音效時(shí),最難管理的事情之一是音調(diào)的時(shí)間或持續(xù)時(shí)間,以及(以近乎同時(shí)的)方式在屏幕上飛舞的精靈。 在90年代,英特爾x86架構(gòu)(PC)統(tǒng)治期間,最受歡迎的聲卡稱為Creative Technologies生產(chǎn)的Sound Blaster 16 。 最棒的是,這款聲卡在玩游戲時(shí)非常令人驚奇,因?yàn)樗蔷哂行酒M的獨(dú)立卡,能夠以立體聲(兩個(gè)通道)播放Midi聲音和音樂(lè)。 聲卡與CD ROM播放器捆綁在一起,可以播放音樂(lè)CD。 Sound Blaster的另一個(gè)炫酷功能是其15針MIDI /操縱桿多端口,可連接游戲輸入設(shè)備。 如今(將來(lái)),聲卡能夠支持環(huán)繞聲(3D音頻效果),各種聲音格式,錄制,各種音樂(lè)格式,MIDI和混合。 多任務(wù)處理使現(xiàn)代計(jì)算機(jī)能夠(同時(shí))在平行軌道上播放聲音/音樂(lè)。
接下來(lái),我們將創(chuàng)建一個(gè)聲音管理器服務(wù),該服務(wù)將添加到游戲引擎框架庫(kù)( JFXGen )中。
聲音管理員服務(wù)
GameWorld類包含諸如精靈管理器之類的服務(wù),以及(最近)對(duì)SoundManager (單個(gè))實(shí)例的引用。 聲音管理器服務(wù)負(fù)責(zé)管理游戲的所有聲音效果。 此服務(wù)允許開發(fā)人員使用loadSoundEffects()方法加載聲音片段( AudioClip )。 加載聲音效果后,可以使用映射到聲音的唯一ID(字符串)來(lái)檢索每個(gè)音頻剪輯。 最后一個(gè)方法是shutdown()方法。 退出應(yīng)用程序時(shí),stop方法將調(diào)用GameWorld的shutdown()方法,該方法進(jìn)而調(diào)用SoundManager對(duì)象的shutdown來(lái)清理所有資源。 SoundManager實(shí)例具有一個(gè)線程池,該線程池可以正常關(guān)閉。
注意:為簡(jiǎn)潔起見,我設(shè)計(jì)了SoundManager類,以便在游戲過(guò)程中播放簡(jiǎn)單的音頻片段,盡管不是音樂(lè)。 如果要添加音樂(lè),請(qǐng)參考Media和MediaPlayer API上的JavaDoc。
下面顯示的是SoundManager類圖:
| 圖2:聲音管理器的類圖 |
以下是SoundManager類的源代碼:
package carlfx.gameengine;import javafx.scene.media.AudioClip;import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/*** Responsible for loading sound media to be played using an id or key.* Contains all sounds for use later. *</pre> <pre> * User: cdea*/ public class SoundManager {ExecutorService soundPool = Executors.newFixedThreadPool(2);Map<String, AudioClip> soundEffectsMap = new HashMap<>();/*** Constructor to create a simple thread pool.** @param numberOfThreads - number of threads to use media players in the map.*/public SoundManager(int numberOfThreads) {soundPool = Executors.newFixedThreadPool(numberOfThreads);}/*** Load a sound into a map to later be played based on the id.** @param id - The identifier for a sound.* @param url - The url location of the media or audio resource. Usually in src/main/resources directory.*/public void loadSoundEffects(String id, URL url) {AudioClip sound = new AudioClip(url.toExternalForm());soundEffectsMap.put(id, sound);}/*** Lookup a name resource to play sound based on the id.** @param id identifier for a sound to be played.*/public void playSound(final String id) {Runnable soundPlay = new Runnable() {@Overridepublic void run() {soundEffectsMap.get(id).play();}};soundPool.execute(soundPlay);}/*** Stop all threads and media players.*/public void shutdown() {soundPool.shutdown();}}如何在JavaFX中播放聲音效果?
在JavaFX 2中,您可以使用AudioClip API以較小的開銷有效地播放小型聲音文件。 該API允許重復(fù)播放聲音。 一個(gè)示例是玩家射擊武器(按下鼠標(biāo)左鍵),使激光發(fā)出““”的聲音。 說(shuō)到演示游戲中的激光,我使用了FreeSound.org網(wǎng)站上的一個(gè)免費(fèi)聲音文件,該文件具有知識(shí)共享許可。 由于該文件是wav文件格式,因此它大于所需的大小。 因此,我決定將文件轉(zhuǎn)換為mp3聲音格式。 我覺(jué)得減小文件大小(較小的占用空間)以加快加載速度非常重要。 將文件轉(zhuǎn)換為mp3聲音格式時(shí),我使用了Sony的Sound Forge軟件。 下面顯示的是播放小型聲音文件的代碼段:
AudioClip sound = new AudioClip('laser.mp3');sound.play();如何在JavaFX中播放音樂(lè)?
盡管SoundManager (我的實(shí)現(xiàn))不播放音樂(lè),但添加功能很容易。 以下代碼段顯示了如何使用Media和MediaPlayer API加載要播放的MP3文件:
Media media = new Media('hymetojoy.mp3');MediaPlayer player = MediaPlayerBuilder.create().media(media).onReady( new Runnable() {@Overridepublic void run() {player.play();}).build();JavaFX聲音演示
要求 :
- Java 7或更高版本
- JavaFX 2.1或更高版本
- Windows XP或更高版本(應(yīng)該很快可用于Linux / MacOS)
一個(gè)簡(jiǎn)單的小行星類型游戲,名為“ The Expanse”。
說(shuō)明:
- 右鍵單擊(在Windows上)以飛船。
- 單擊鼠標(biāo)左鍵(在Windows鼠標(biāo)上單擊鼠標(biāo)左鍵)即可射擊武器。
- 按鍵'2? 變成大型導(dǎo)彈。 (藍(lán)色圓形彈丸)
- 其他按鍵默認(rèn)為較小的導(dǎo)彈。 (紅色圓形彈丸)
- 按下空格鍵將切換力場(chǎng),以保護(hù)飛船免受敵人和小行星的傷害。
單擊下面的啟動(dòng)按鈕以啟動(dòng)演示:
有用的鏈接
- Apple] [規(guī)格: http : //apple2history.org/history/ah03/
- 蘋果機(jī)上的8位] [: http : //eightbitsoundandfury.ld8.org/programming.html
- 聲霸卡: http : //en.wikipedia.org/wiki/Sound_Blaster
- JFXGen: https : //github.com/carldea/JFXGen
- JavaFX的AudioClip API: http : //docs.oracle.com/javafx/2/api/javafx/scene/media/AudioClip.html
- 索尼Sound Forge: http : //www.sonycreativesoftware.com/soundforgesoftware
- Freesound.org: http://www.freesound.org
- 來(lái)自Freesound.org的激光聲音: http ://www.freesound.org/people/THE_bizniss/sounds/39459/
- 知識(shí)共享許可證: http : //creativecommons.org/licenses/sampling+/1.0/
- 媒體API: http : //docs.oracle.com/javafx/2/api/javafx/scene/media/Media.html
- MediaPlayer API: http : //docs.oracle.com/javafx/2/api/javafx/scene/media/MediaPlayer.html
參考:來(lái)自我們的JCG合作伙伴 Carl Dea的JavaFX 2 GameTutorial第5部分 ,位于Carl's FX Blog博客上。
翻譯自: https://www.javacodegeeks.com/2012/08/javafx-2-gametutorial-part-5.html
總結(jié)
以上是生活随笔為你收集整理的JavaFX 2 GameTutorial第5部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 知识用英语怎么说 知识英语解释
- 下一篇: JBoss核心Java Web服务