javafx2_JavaFX 2 GameTutorial第5部分

javafx2

介绍

这是与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

javafx2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab各种最值问题

最大最小maxmin求多个最小值,并返回其位置[B,ind] sort(A);B(1:n);前n个最小值ind(1:n);前n个最小值的位置

最长递增子序列问题的求解

最长递增子序列问题是一个很基本、较常见的小问题&#xff0c;但这个问题的求解方法却并不那么显而易见&#xff0c;需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想&#xff0c;能够锻炼设计较复杂算法的思维…

史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

转载请标明出处&#xff1a; 原文首发于&#xff1a;https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/ 本文出自方志朋的博客 在上一篇文章&#xff0c;讲了服务的注册和发现。在微服务架构中&#xff0c;业务都会被拆分成一个独立的服务&#xff0c;服务与服…

忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目

Github和Sourceforge上超过600,000个Java项目中的异常处理概述 Java是使用检查异常的少数语言之一。 它们在编译时强制执行&#xff0c;并且需要某种处理。 但是……实践中会发生什么&#xff1f; 大多数开发人员实际上处理任何事情吗&#xff1f; 以及他们如何做到的&#xf…

Matlab积分

yint(fx,x,a,b);%函数表达式&#xff0c;自变量&#xff0c;下限&#xff0c;上限注&#xff1a;求得到y为sym类型&#xff0c;不是数值&#xff0c;可以使用subs转换如&#xff1a;subs(y,1); subs(y,a,1);%第一个给y赋1&#xff0c;第二个给y中的a赋1

最长有序子序列—动态规划算法

动态规划使用范围&#xff1a;&#xff08;http://baike.baidu.com/view/28146.htm&#xff09; 任何思想方法都有一定的局限性&#xff0c;超出了特定条件&#xff0c;它就失去了作用。同样&#xff0c;动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效…

Codeforces 666E. Forensic Examination

Description 给出串 \(S\) ,和 \(m\) 个串 \(T_i\) ,每次询问 \((l,r,pl,pr)\) 表示 \(S[pl...pr]\) 在 \(T[l...r]\) 中哪一个出现次数最多,求出现次数和编号题面 Solution 基础题... 对于 \(S,T[l...r]\) 放在一起建广义后缀自动机 然后每次倍增到 S[pl,pr] ,然后查询子树内出…

Matlab控制精度

控制精度matlab控制运算精度用的是digits和vpa这两个函数digits用于规定运算精度&#xff0c;比如&#xff1a;digits(20);这个语句就规定了运算精度是20位有效数字。但并不是规定了就可以使用&#xff0c;因为实际编程中&#xff0c;我们可能有些运算需要控制精度&#xff0c;…

虚拟机环境下DPDK运行时的一些错误解决

在绑定网卡到DPDK模块时 报错 &#xff1a;is active. Not modifyingRouting table indicates that interface 0000:02:01.0 is active. Not modifying 解决方法&#xff1a; ifconfig <网卡名称> down 运行testpmd时无法分配内存&#xff1a;EAL: Error - exiting with …

ACM 网址和一些建议

USACO http://ace.delos.com/usacogate 美国著名在线题库&#xff0c;专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库&#xff0c;唯一的中文题库&#xff0c;适合NOIP选手 ZJU http://acm.zju.edu.cn/ 浙江大学在线题库 JLU http://acm.jlu…

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在服务器而不是我自己…

Matlab各种求和

%普通求和sum(x);sum(x,1);sum(x,2); %累加求和cumsum(x);cumsum(x,1);cumsun(x,2); %累加求和的结果可以用diff实现逆运算

JavaScript内置对象Date----格式化时间

格式化时间日期: function getDate(dt) { //获取年份 var year dt.getFullYear(); //获取月份 var month dt.getMonth(); //获取日 var day dt.getDate(); //获取小时 var hour dt.getHours(); //获取分钟 var minute dt.getMinutes(); …

Matlab求欧式距离

pdist(x,‘euclidean’)1. %该函数还可以求其他距离&#xff0c;详见help2. %该函数得到的是一个向量&#xff0c;可以用squareform(Y)函数转换为对称矩阵形式。

川流不息

网站收藏&#xff1a; 1、站长网 网页教程与代码 2、博客制作 3、Java实例编程 贪吃蛇游戏开发视频教程

dao层通用封装_DAO层–救援通用

dao层通用封装泛型可以是使用编译时验证&#xff08;类型安全性&#xff09;的功能来创建可重用代码的强大工具。 不幸的是&#xff0c;我感到主流开发人员仍然对此感到恐惧。 但是&#xff0c;比喻海格的蜘蛛&#xff0c;我会说&#xff0c;泛型是被严重误解的生物……:-) 我…

(转) Linux 内核运行参数修改——sysctl命令

原文&#xff1a;https://blog.csdn.net/u012707739/article/details/78254241 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff0c;用sysctl可以读取设置超过五百个…

Matlab求平均值函数mean

amean(A,1) %按列平均bmean(A,2) %按行平均cmean(A(:)) %全部平均

HDU 4514 湫湫系列故事——设计风景线

一次dfs判断有没有环 两次dfs求最长路 第一次记录最长路和次长路 第二次求出答案 #include <iostream>#include <string>#include <cstring>#include <algorithm>#include <cstdio>#define maxn 100010#pragma comment(linker, "/STACK:367…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html