Озвучку движения игрока сделал. Слегка пришлось повозиться, правда (: Обычно я эмулятор использовал только для игр, но они, как выяснилось, позволяют дебажить игры и вытаскивать из них ресурсы =D
Вообще, первоначальная проблема была в том, что не было у меня звуковых файлов из игры. Пропарсив .nes файлы, кое-что достать удалось, но вот звуки движений не получилось. Думал, как же вытащить или где найти. Оказалось, что эмулька Nestopia позволят писать аудио потоки из игры прям в файл. Ну да, многие эмуляторы это умеют, но в этом можно заглушать некоторые потоки. Заглушил поток фоновой музыки и засейвил звуки движений. Потом, правда, в Audacity подгонять пришлось, чтоб бесшовно звук был.
В итоге, звуки есть, теперь надо их как-то использовать в libgdx. Сразу пришлось в классе Bomberman
менять direction
. Двигает то он, как правило, только в одном направлении, но вот в оригинальной игре озвучка движения по вертикали и горизонтали отличается. Логично конечно просто запускать обе озвучки, если двигается по двум направлениям сразу, но как оказалось озвучка в оригинальной игре — это не просто запуск двух озвучек, а именно отдельная (:
Собственно, создал массив ауди спрайтов, так сказать, и юзал уже их потом:
//массив аудио дорожек public Map<String, Sound> sounds = new HashMap<String, Sound>(); //добавляем необходимые дорожки private void loadSounds(){ sounds.put("left-right", Gdx.audio.newSound(Gdx.files.internal("audio/left-right.ogg"))); sounds.put("up-down", Gdx.audio.newSound(Gdx.files.internal("audio/up-down.ogg"))); sounds.put("double-direction", Gdx.audio.newSound(Gdx.files.internal("audio/double-direction.ogg"))); }
Теперь просто надо в нужный момент проигрывать. При рендеринге сцены вызываю метод:
//играет музло или нет boolean isPlaying = false; private void playMusic(){ Bomberman bomberman = world.getBomberman(); //есил игрок двигается if(bomberman.getState() == Bomberman.State.WALKING){ //если мызыка не играет if(!isPlaying) { isPlaying = true; //если идём по горизонтали и не по вертикали if((bomberman.getDirection(Bomberman.Direction.LEFT) || bomberman.getDirection(Bomberman.Direction.RIGHT)) &&!(bomberman.getDirection(Bomberman.Direction.UP) || bomberman.getDirection(Bomberman.Direction.DOWN))) //врубаем музло...loop означает, что зациклена мызыка //в противоположность play(), который сыграет лишь 1 раз sounds.get("left-right").loop(); ... //дальше по аналогии для движения по вертикали } } //если не движемся else{ //если играет музло if(isPlaying){ //отключаем isPlaying = false; sounds.get("left-right").stop(); sounds.get("up-down").stop(); sounds.get("double-direction").stop(); } } }
Вот и вся магия. И да, ничто не мешает вам одновременно несколько Audio файлов проигрывать: фон и движение. libgdx их в разных потоках крутит, что очень радует. Единственное, что не понимаю, почему нету метода по проверке вроде «isPlaying». Приходится самому флаги создавать.
UDP: как оказалось, надо просто использовать класс Music
вместо Audio
. У него как раз есть метод isPlaying()
, что позволяет не создавать лишних флагов (: