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() {
            @Override
            public 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() {
                             @Override
                             public void run() {
                                player.play();
                             })
                         .build();

JavaFX声音演示

要求

  • Java 7或更高版本
  • JavaFX 2.1或更高版本
  • Windows XP或更高版本(应该很快可用于Linux / MacOS)

一个简单的小行星类型游戏,名为“ The Expanse”。

说明:

  • 右键单击(在Windows上)以飞船。
  • 鼠标左键单击(Windows鼠标左键)开火。
  • 按键'2? 变成大型导弹。 (蓝色圆形弹丸)
  • 其他按键默认为较小的导弹。 (红色圆形弹丸)
  • 按下空格键将切换力场,以保护飞船免受敌人和小行星的伤害。

单击下面的启动按钮以启动演示:

有用的链接

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


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

javafx2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值