Все о звуках в ModPE

Все о звуках в ModPE

Сегодня мы разберемся со звуками в ModPE. Для этого в API есть две функции,

1
2
Level.playSound(x, y, z, sound, volume, pitch);
Level.playSoundEnt(entity, sound, volume, pitch);

Вот их аргументы:

  • x, y, z – координаты
  • sound – название звука (тут все звуки)
  • volume – громкость, в каких пределах – непонятно)))
  • pitch – направление, в градусах, от 0 до 360. В принципе, неважно, разница небольшая.

Тут все просто, вот пример:

1
2
3
function useItem(x,y,z,itemid,blockid,side,itemDamage,blockDamage) {
    Level.playSound(x,y,z,"random.burp", 500, 25);
}

С мобами – аналогично, только вместо координат – uid моба.

Но достаточно ли этого для полноценной игры? Конечно же нет, так как нигде ни слова не было сказано про пользовательские звуки. Их в чистом ModPE API и нету. Поэтому будем использовать Android API, как было описано в этой статье.

В os Android за воспроизведение звуков отвечает класс android.media.MediaPlayer. Введем нужные переменные:

1
2
3
var ctx = com.mojang.minecraftpe.MainActivity
    .currentMainActivity.get();
var mediaPlayer = new android.media.MediaPlayer();

Для того, чтобы запустить звук из текстурпака его придется скопировать во временный файл (MediaPlayer‘у нужен FileInputStream, результат вызова ModPE.openInputStreamFromTexturePack ему не подошел, другой тип потока, ну и ладно):

1
2
3
4
5
6
7
8
9
10
11
12
13
//наш файлик в текстурпаке
var bytes = ModPE.getBytesFromTexturePack(filename);
//создаем временный файл
tempMp3 = java.io.File.createTempFile("temp", "mp3", 
    ctx.getCacheDir());
//чтобы файл удалялся при закрытии Майнкрафта
tempMp3.deleteOnExit();
//открываем выходной поток
var fos = new java.io.FileOutputStream(tempMp3);
//записываем наш файл
fos.write(bytes);
//обязательно закрываем, иначе не откроется дальше)
fos.close();

Дальше нужно создать наш медиаплеер, вот код:

1
2
3
4
5
6
7
8
9
10
//обновляем, для избежания ошибок
mediaPlayer.reset();
//открываем входной поток
var fis = new java.io.FileInputStream(tempMp3);
//так задается файл, который MediaPlayer будет проигрывать
mediaPlayer.setDataSource(fis.getFD());
//приготовить файл к воспроизведению
mediaPlayer.prepare();
//наконец, воспроизвести
mediaPlayer.start();

В принципе, на этом можно было бы поставить точку, но мы пойдем дальше, и уберем серьезный лаг при запуске этого кода. Для этого воспользуемся потоком и обернем все это в функцию, весь код представлен ниже:

1
2
3
4
5
6
7
8
9
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
var ctx = com.mojang.minecraftpe.MainActivity
    .currentMainActivity.get();
var mediaPlayer = new android.media.MediaPlayer();
 
function playSoundFile(filename){
    try {
        var tempMp3;
        var thread=new java.lang.Thread(new java.lang.Runnable({
            run:function(){
                var bytes = ModPE.getBytesFromTexturePack(filename);
                tempMp3 = java.io.File.createTempFile("temp", 
                    "mp3", ctx.getCacheDir());
                tempMp3.deleteOnExit();
                var fos = new java.io.FileOutputStream(tempMp3);
                fos.write(bytes);
                fos.close();
 
                mediaPlayer.reset();
                var fis = new java.io.FileInputStream(tempMp3);
                mediaPlayer.setDataSource(fis.getFD());
                mediaPlayer.prepare();
                mediaPlayer.start();
            }
        }));
        thread.start();
 
    } catch(e) {
        print("Error occured: " + e);
    }
}
 
function useItem(x,y,z,itemid,blockid,side,itemDamage,blockDamage) {
    playSoundFile("sounds/1.mp3");
}

Еще несколько полезных функций MediaPlayer‘а:

1
2
3
4
5
6
7
8
9
getDuration()//возвращает длительность звукового файла
pause()//ставит воспроизведение на паузу
release()//освободить ресурсы, используемые плеером
seekTo(int msec)//играть с определенного времени
setLooping(boolean looping)//установить, повторять или нет
setVolume(float leftVolume, float rightVolume)//громкость, 
//правый и левый наушники
start()//не только в начале, но и после паузы
stop()//остановить воспроизведение

Таким образом можно воспроизводить любые звуки в ModPE. Данный код – лишь базовый функционал, его можно изменять, балуясь с громкостью, циклами, изменением звука и т д.

This entry was posted in ModPE. Bookmark the permalink.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *