Все о звуках в 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. Данный код — лишь базовый функционал, его можно изменять, балуясь с громкостью, циклами, изменением звука и т д.
Comments