JavaFX 2 GameTutorial第5部分

介紹

這是與JavaFX 2 Game Tutorial相關的六部分系列的第五部分。 我知道自從我寫關于游戲的博客以來已經很長時間了,但希望您仍然與我在一起。 如果您想回顧一下,請閱讀第1部分第2 部分第3 部分第4 部分 ,以了解我們從哪里結束。 如果您是最新的,那就開始吧! 在此博客文章中,我們將聲音整合到我們的游戲中。

圖1:JavaFX Sound FX

有許多元素可以使游戲變得異常有趣,例如動畫效果,碰撞,AI和輸入。 但是, 聲音是游戲最重要的要素之一。 當游戲將聲音效果和音樂融為一體時,玩家將沉浸其中(嗯……就像沒有意識到自己即將看到太陽升起一樣)。 在詳細介紹之前,讓我為您介紹一些家用電腦PC游戲中使用的聲音的背景歷史。 如果您想跳過歷史并開始工作,請跳至“聲音管理器服務”部分。 聲音管理器服務負責維護游戲期間使用的聲音資產。 如果您真的急躁并且不關心實現細節,請跳至“ JavaFX Sound Demo”。 重要說明: 在啟動演示之前,請記住閱讀要求。

歷史

如果您想今天了解,則必須昨天進行搜索。 ?珍珠巴克

早在我長大的那一天,我就知道Apple []計算機可以播放聲音。 Apple []的揚聲器只能產生簡單的音調(8位單聲道聲音)。 當我第一次發出聲音(瑪麗有只小羊羔)時,我完全感到驚訝。 如果您對使用Applesoft Basic的peek和poke命令編寫音樂的機器代碼感興趣,請訪問8位Sound and Fury 。 即使8位看起??來非常簡單(因為值太少),但事實并非如此。 在為游戲創建音效時,最難管理的事情之一是音調的時間或持續時間,以及(以近乎同時的)方式在屏幕上飛舞的精靈。 在90年代,英特爾x86架構(PC)統治期間,最受歡迎的聲卡稱為Creative Technologies生產的Sound Blaster 16 。 最棒的是,這款聲卡在玩游戲時非常令人驚奇,因為它是具有芯片組的獨立卡,能夠以立體聲(兩個通道)播放Midi聲音和音樂。 聲卡與CD ROM播放器捆綁在一起,可以播放音樂CD。 Sound Blaster的另一個炫酷功能是其15針MIDI /操縱桿多端口,可連接游戲輸入設備。 如今(將來),聲卡能夠支持環繞聲(3D音頻效果),各種聲音格式,錄制,各種音樂格式,MIDI和混合。 多任務處理使現代計算機能夠(同時)在平行軌道上播放聲音/音樂。

接下來,我們將創建一個聲音管理器服務,該服務將添加到游戲引擎框架庫( JFXGen )中。

聲音管理員服務

GameWorld類包含諸如精靈管理器之類的服務,以及(最近)對SoundManager (單個)實例的引用。 聲音管理器服務負責管理游戲的所有聲音效果。 此服務允許開發人員使用loadSoundEffects()方法加載聲音片段( AudioClip )。 加載聲音效果后,可以使用映射到聲音的唯一ID(字符串)來檢索每個音頻剪輯。 最后一個方法是shutdown()方法。 退出應用程序時,stop方法將調用GameWorldshutdown()方法,該方法進而調用SoundManager對象的shutdown來清理所有資源。 SoundManager實例具有一個線程池,該線程池可以正常關閉。

注意:為簡潔起見,我設計了SoundManager類,以便在游戲過程中播放簡單的音頻片段,盡管不是音樂。 如果要添加音樂,請參考MediaMediaPlayer 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允許重復播放聲音。 一個示例是玩家射擊武器(按下鼠標左鍵),使激光發出““”的聲音。 說到演示游戲中的激光,我使用了FreeSound.org網站上的一個免費聲音文件,該文件具有知識共享許可。 由于該文件是wav文件格式,因此它大于所需的大小。 因此,我決定將文件轉換為mp3聲音格式。 我覺得減小文件大小(較小的占用空間)以加快加載速度非常重要。 將文件轉換為mp3聲音格式時,我使用了Sony的Sound Forge軟件。 下面顯示的是播放小型聲音文件的代碼段:

AudioClip sound = new AudioClip('laser.mp3');sound.play();

如何在JavaFX中播放音樂?

盡管SoundManager (我的實現)不播放音樂,但添加功能很容易。 以下代碼段顯示了如何使用MediaMediaPlayer 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或更高版本(應該很快可用于Linux / MacOS)

一個簡單的小行星類型游戲,名為“ The Expanse”。

說明:

  • 右鍵單擊(在Windows上)以飛船。
  • 單擊鼠標左鍵(在Windows鼠標上單擊鼠標左鍵)即可射擊武器。
  • 按鍵'2? 變成大型導彈。 (藍色圓形彈丸)
  • 其他按鍵默認為較小的導彈。 (紅色圓形彈丸)
  • 按下空格鍵將切換力場,以保護飛船免受敵人和小行星的傷害。

單擊下面的啟動按鈕以啟動演示:

有用的鏈接

  • Apple] [規格: http : //apple2history.org/history/ah03/
  • 蘋果機上的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
  • 來自Freesound.org的激光聲音: http ://www.freesound.org/people/THE_bizniss/sounds/39459/
  • 知識共享許可證: 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

參考:來自我們的JCG合作伙伴 Carl Dea的JavaFX 2 GameTutorial第5部分 ,位于Carl's FX Blog博客上。


翻譯自: https://www.javacodegeeks.com/2012/08/javafx-2-gametutorial-part-5.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371293.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371293.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371293.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

h5是可以一鍵打包小程序的_H5手機網站封裝打包微信小程序并實現分享及微信支付...

手機網站打包小程序教程&#xff0c;生成小程序&#xff0c;網頁版小程序 打包微信小程序&#xff0c;H5封裝成微信小程序。微信小程序開發一般分為2種方式&#xff0c;一種就是原生開發小程序&#xff0c;一種是將手機網站打包成小程序。原生開發小程序成本較高&#xff0c;技…

Hive中的數據庫、表、數據與HDFS的對應關系

1、hive數據庫 我們在hive終端&#xff0c;查看數據庫信息&#xff0c;可以看出hive有一個默認的數據庫default&#xff0c;而且我們還知道hive數據庫對應的是hdfs上面的一個目錄&#xff0c;那么默認的數據庫default到底對應哪一個目錄呢&#xff1f;我們可以通過hive配置文件…

軟件工程概論作業3

轉載于:https://www.cnblogs.com/clueless/p/6568351.html

使用JSF的面向服務的UI

在大型軟件開發項目中&#xff0c;面向服務的體系結構非常常見&#xff0c;因為它提供了可供不同團隊或部門使用的功能接口。 創建用戶界面時&#xff0c;應應用相同的原理。 對于具有開票部門和客戶管理部門等的大型公司&#xff0c;組織結構圖可能如下所示&#xff1a; 如果計…

pocib模板流程圖_各單據流程POCIB

POCIB各階段流程報關流程從廣義上講&#xff0c;報關是指進出境運輸工具負責人、進出境口貨物收發貨人、進出境物品的所有人或者他們的代理人向海關辦理運輸工具、貨物、物品進出境手續及相關手續的全過程。其中&#xff0c;進出境運輸工具負責人、進出口貨物收發貨人、進出境物…

WinDbg 查看靜態變量

有如下Class。若想查看靜態變量內容。因為靜態變量和類綁定&#xff0c;僅需要查看類即可。 namespace ConsoleApplication13 {class Program{public static string public_string "pubstr_static";public static string private_string "pristr_static"…

vue 固定div 滾動_vue.js-div滾動條隱藏但有滾動效果的實現方法

組件被包在一個高度固定的divmounted () {var boDiv document.getElementById(this.id);if(boDiv undefined){return;}var isFirefoxnavigator.userAgent.indexOf("Firefox")if(isFirefox>0){boDiv.addEventListener(DOMMouseScroll, function(event) { //火狐v…

JBoss核心Java Web服務

這篇博客文章涉及Web服務。 好吧&#xff0c;更確切地說&#xff0c;它處理JBoss上的“普通” java Web服務。 這意味著我們將創建一個沒有任何其他框架&#xff08;如CXF&#xff0c;Axis等&#xff09;的Web服務。 JBoss它自己提供對Web服務的支持。 因此&#xff0c;如果您真…

JavaSE--for each

參考&#xff1a;http://blog.csdn.net/yasi_xi/article/details/25482173 學習多線程的時候實例化線程數組而挖掘出來的一直以來的理解誤區 之前一直以為for each 本質上和for循環以及迭代器沒什么區別 1 package foreach;2 3 public class ForeachDemo1 {4 5 public …

[BZOJ1726][Usaco2006 Nov]Roadblocks第二短路

1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1277 Solved: 607 [Submit][Status][Discuss]Description 貝茜把家搬到了一個小農場&#xff0c;但她常常回到FJ的農場去拜訪她的朋友。貝茜很喜歡路邊的風景&#xff0c;不想那么快…

mysql 5.1.62_MySQL 5.5.62 安裝方法(標準配置版)

1.此安裝方法適用于絕大多數MySQL版本&#xff0c;首先在MySQL官網上下載好所需版本。2.(官網可能不太好找)在我的博客列表中有一篇是MySQL官網下載鏈接&#xff0c;直達下載界面&#xff0c;方便。3.下載。(安裝版 MSI Installer)4.下載安裝包然后雙擊開始安裝選擇同意協議并…

簡化Java內存分析

作為一名典型的Java開發人員&#xff0c;除了遵循關閉連接&#xff0c;流等典型的最佳實踐外&#xff0c;我從未監視過應用程序的內存使用情況。最近&#xff0c;我們在JBoss服務器中遇到了一些問題&#xff0c;不得不深入研究內存管理Java中最好的事情之一是&#xff0c;創建對…

nyoj 1129 Salvation 模擬

思路&#xff1a;每個坐標有四種狀態&#xff0c;每個點對應的每種狀態只能走一個方向&#xff0c;如果走到一個重復的狀態說明根本不能走到終點&#xff0c;否則繼續走即可。 坑點&#xff1a;有可能初始坐標四周都是墻壁&#xff0c;如果不判斷下可能會陷入是死循環。 貼上測…

詳解mysql數據庫的啟動與終止_詳解MySQL數據庫的啟動與終止(一)

由于MySQL服務器具有多種安裝分發&#xff0c;而且能夠運行在多種操作平臺之上&#xff0c;因此它的啟動與停止的方法也多種多樣。你可以根據實際情況使用其中的一種。在你安裝、升級或者維護系統時&#xff0c;你可能需要多次啟動和終止服務器&#xff0c;你需要了解啟動和終止…

easyui 插入中間行

function inserrow() {var index_dx 0;var index_lt 0;var rows $(#dg).datagrid(getRows)//獲取當前的數據行前期數據準備for (var i 0; i < rows.length; i) {if (rows[i][運營商] 電信) {index_dx i;dxptjss_dx parseInt(rows[i][短信平臺接收數]);} else {index_…

使用JNA的透明JFrame

在“ 使JFrame透明”中&#xff0c;我展示了一種使用AWTUtilities類使框架透明的方法。 但是使用該類會導致訪問限制編譯時錯誤&#xff0c;該文章中還顯示了Eclipse中的解析。 現在&#xff0c;這里是使用Java本機的版本。 我使用Java本機訪問&#xff08;JNA&#xff09;庫來…

Problem: Query on the tree(二分+劃分樹)

題目鏈接&#xff1a; Problem: Query on the tree Time limit: 1s Mem limit: 64 MB Problem DescriptionThere is a tree with n node, labeled from 1 to n, and the root of the tree is 1. For every node i, if its father is j, its value vivj*i%20161119, the…

day04_09 while循環03

練習題: 3.如何輸入一個如下的直角三角形,用戶指定輸出行數:(如果上下反轉,右如何實現?) ********** 以下是自己的思路,沒有按照上課老師的思路,反正經過不斷的測試改進得出的算法 num int(input("請輸入行數")) line 1 while line < num1:lie 1 while lie &l…

idal 創建springboot 項目_手把手的SpringBoot教程,SpringBoot創建web項目(四)

在實際的開發過程中&#xff0c;我們需要前端頁面向Java端提交請求&#xff0c;這些請求一般分為get方式和post方式&#xff0c;不管是哪一種方式&#xff0c;一般都會攜帶一些參數。這一節&#xff0c;我們來演示一下如何給Controller傳遞參數。代碼&#xff1a;RestControlle…

JavaOne 2012:Lambda之路

我最熱切期待的JavaOne 2012演講之一是Brian Goetz的“通往Lambda的道路”。 昨晚的技術主題演講中的Lambda味道僅增加了預期。 這是在希爾頓廣場A / B舉行的&#xff0c;距離我上次在金門大橋A / B / C參加的演講僅幾步之遙。 我原本希望打包相對較大的Plaza A / B&#xff08…