Статьи

JavaFX 2 GameTutorial, часть 5

Вступление

Это пятая часть серии из шести частей, относящихся к учебному пособию по JavaFX 2 . Я знаю, что я давно не писал об играх, но надеюсь, что вы все еще со мной. Если вы хотите подвести итоги, пожалуйста, прочитайте Часть 1 , Часть 2 , Часть 3 и Часть 4, чтобы узнать, где мы остановились. Если вы в курсе, тогда давайте начнем! В этой записи блога мы будем включать звуки в нашу игру.

Рисунок 1: JavaFX Sound FX

Есть много элементов, которые делают игры невероятно увлекательными, такие как анимированные эффекты, столкновения, AI и ввод. Тем не менее, одним из наиболее важных компонентов игрового процесса является звук . Когда в играх используются звуковые эффекты и музыка, геймер погружается в атмосферу (тьфу… как будто не понимаешь, что ты скоро увидишь восход солнца). Прежде чем мы углубимся в детали, позвольте мне рассказать вам немного об истории звука, используемого в компьютерных играх для домашнего компьютера. Если вы хотите пропустить историю и приступить к делу, перейдите в раздел «Служба Sound Manager». Сервис Sound Manager отвечает за поддержание звуковых ресурсов, используемых во время игры. Если вы действительно нетерпеливы и не заботитесь о деталях реализации, перейдите к разделу «JavaFX Sound Demo». Важное примечание: не забудьте прочитать требования перед запуском демо.

история

Если вы хотите понять сегодня, вы должны искать вчера. ~ Жемчужный Бак

В тот день, когда я рос, я узнал, что компьютер Apple] [ способен воспроизводить звуки. Apple] [имел один динамик, который мог воспроизводить только простые звуки (8-битный монофонический звук). Когда я впервые издала тоны (у Мэри был маленький ягненок), я была полностью поражена. Если вы заинтересованы в машинном коде, использующем команды peles и poke Applesoft Basic для создания музыки, посетите раздел 8 bit Sound and Fury . Хотя 8 битов казались очень простыми (потому что их было так мало), это не так. При создании звуковых эффектов для игр одной из самых сложных вещей для управления было время или длительность тонов в сочетании со спрайтами, летящими по экрану (почти) одновременно. В 90-х годах, во времена правления архитектуры Intel x86 (ПК), самой популярной звуковой картой была названа Sound Blaster 16 производства Creative Technologies. Изначально эта звуковая карта была довольно удивительной, когда играла в игры, потому что это была отдельная карта с чипсетом, способным воспроизводить звуки миди и музыку в стерео (два канала). Звуковая карта была в комплекте с проигрывателем компакт-дисков, позволяющим вставлять музыкальный компакт-диск. Еще одна интересная особенность Sound Blaster — его 15-контактный мультипорт MIDI / Joystick, позволяющий подключать игровые устройства ввода. Сегодня (в будущем) звуковые карты способны поддерживать объемный звук (трехмерные звуковые эффекты), различные форматы звука, запись, различные музыкальные форматы, миди и микширование. Многозадачность позволяет современным компьютерам воспроизводить звуки / музыку на параллельных дорожках (одновременно).

Далее мы создадим сервис менеджера звука, который будет добавлен в библиотеку фреймворка игрового движка ( JFXGen ).

Сервис Sound Manager

Класс GameWorld содержит такие службы, как диспетчер спрайтов и (в последнее время) ссылку на экземпляр SoundManager (singleton). Служба управления звуком отвечает за управление всеми звуковыми эффектами игры. Этот сервис позволяет разработчику загружать аудиоклипы ( AudioClip ) с помощью метода loadSoundEffects () . После загрузки звуковых эффектов каждый аудиоклип можно извлечь, используя уникальный идентификатор (String), сопоставленный со звуком. Последний метод — это метод shutdown () . Когда приложение закрывается, метод stop вызывает метод shutdown () GameWorld, который, в свою очередь, вызывает завершение работы объекта SoundManager для очистки любых ресурсов. Экземпляр SoundManager имеет пул потоков, который корректно завершается .

Примечание. Для краткости я разработал класс SoundManager для воспроизведения простых аудиоклипов, но не музыки, во время игры. Если вы хотите добавить музыку, обратитесь к JavaDoc в Media и MediaPlayer API.

Ниже показана диаграмма классов SoundManager :

Рисунок 2: Диаграмма классов Менеджера звука

Ниже приведен исходный код класса SoundManager :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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 вы можете эффективно воспроизводить небольшие звуковые файлы с меньшими затратами, используя API AudioClip . Этот API позволяет воспроизводить звук повторно. Примером может служить геймер, стреляющий из оружия (левое нажатие мыши), который издает лазерный звук «пиу пиу!» Говоря о лазерах в демонстрационной игре, я использовал бесплатный звуковой файл с сайта FreeSound.org с лицензией Creative Commons. Поскольку файл был в формате WAV , он был больше, чем нужно. Итак, я решил преобразовать файл в звуковой формат mp3. Я чувствовал, что было важно уменьшить размер файла (меньший размер) для более быстрой загрузки. При преобразовании файла в звуковой формат mp3 я использовал программное обеспечение Sony Sound Forge . Ниже показан фрагмент кода для воспроизведения небольших звуковых файлов:

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

Как играть музыку в JavaFX?

Хотя SoundManager (моя реализация) не воспроизводит музыку, эту возможность легко добавить. В следующем фрагменте кода показано, как загрузить файл MP3 для воспроизведения с использованием Media и MediaPlayer API:

1
2
3
4
5
6
7
8
9
Media media = new Media('hymetojoy.mp3');
MediaPlayer player = MediaPlayerBuilder.create()
                      .media(media)
                      .onReady( new Runnable() {
                          @Override
                          public void run() {
                             player.play();
                          })
                      .build();

JavaFX Sound Demo

Требования :

  • Java 7 или более поздняя версия
  • JavaFX 2.1 или более поздняя версия
  • Windows XP или более поздняя версия (скоро будет доступна для Linux / MacOS)

Простая игра типа астероидов под названием «Пространство».

Инструкции:

  • Щелкните правой кнопкой мыши (на Windows), чтобы летать на корабле.
  • Щелчок левой кнопкой мыши (левой кнопкой мыши на Windows), чтобы стрелять оружие.
  • Нажмите клавишу «2? перейти на большие ракеты. (синий круговой снаряд)
  • Другое нажатие клавиши по умолчанию для меньших ракет. (красные круглые снаряды)
  • Нажатие клавиши пробела переключит силовое поле, чтобы защитить корабль от врагов и астероидов.

Нажмите кнопку Launch ниже, чтобы начать демонстрацию:

Полезные ссылки

Ссылка: JavaFX 2 GameTutorial, часть 5 от нашего партнера по JCG Карла Деа в блоге Carl’s FX Blog .