Как / Может ли SoundJS загружать звуковые файлы, загруженные другим Preloader(например, Pixi.loaders.Loader())?

В настоящее время я использую Pixi.js и его встроенный Loader, поскольку, просматривая код, я замечаю, что могу также загружать звуки. Я использую другой загрузчик для Sound, который также встроен в SoundJS.

Проблема в том, что для этого мне нужно управлять двумя разными загрузчиками. Один для звука, а другой для текстуры.

У меня есть Pixi.js для загрузки звуковых файлов для меня, как это:

  new PIXI.loaders.Loader()
    .add("_assets/textures/p1_walk/Von.json")
    .add("_assets/textures/p2_walk/Don.json")
    .add("_assets/textures/p3_walk/Bon.json")
    .add("_assets/textures/tiles.json")
    .add("_assets/textures/textures.json")
    //.add('bgm1'       , '_assets/bgm/bgm.mp3')
    .add('jump'       , '_assets/sfx/jump.wav')
    .add('pickupcoin' , '_assets/sfx/pickupcoin.wav')
    .add('hit'        , '_assets/sfx/hit.wav')
    .add('hit1'       , '_assets/sfx/hit1.wav')
    .add('died'       , '_assets/sfx/died.wav')
    .on("progress" , function(loader , resource)
      {
        console.log("Finished loading : " + resource.name + " progress : " + loader.progress);

      })
    .once("complete" , function()
      {
        console.log("Finished loading assets");

        //soundManifest = soundManifest.concat(
        //  [
        //     {id : "bgm1"       , src : "_assets/bgm/bgm.mp3"        }
        //   , {id : "jump"       , src : "_assets/sfx/jump.wav"       }
        //   , {id : "pickupcoin" , src : "_assets/sfx/pickupcoin.wav" }
        //   , {id : "hit"        , src : "_assets/sfx/hit.wav"        }
        //   , {id : "hit1"       , src : "_assets/sfx/hit1.wav"       }
        //   , {id : "died"       , src : "_assets/sfx/died.wav"       }
        //  ]);

        //createjs.Sound.alternateExtensions = ['mp3' , 'ogg' , 'wav' ];
        //createjs.Sound.addEventListener('fileload' , handleLoad);
        //createjs.Sound.registerSounds(soundManifest);

        SoundJS.play("jump");

        loadingScene = new LoadingScene(renderer , screenSize);
      })
    .load();

К сожалению, это не сработает. Звук прыжка не воспроизводится. Я не знаю, как заставить SoundJS загружать / воспроизводить уже загруженный звук совершенно другим / не связанным загрузчиком.

Я не уверен, что делать, как я могу управлять двумя отдельными загрузчиками? Проблема с моим предыдущим состояла в том, что первый загрузчик смог дать мне 0-100% прогресса, который мне очень нужен, чтобы я мог использовать его в моем индикаторе прогресса. Но это только для текстуры, я хотел включить звуки в процентах и ​​решил, что могу использовать только загрузчик и заставить SoundJS загружать файлы оттуда.

Это вообще возможно?

Спасибо!

1 ответ

Решение

SoundJS может воспроизводить только те звуки, которые были зарегистрированы и загружены SoundJS. Может быть возможно зарегистрировать звук и его загруженные данные, используя частные API, но это потребует некоторой работы, и нет официального подхода.

Ключевые вещи, которые вы должны сделать:

  1. Зарегистрируйте звук. AbstractPlugin выполняет большую часть работы, но для завершения процесса требуется событие "complete"
  2. Вы можете заставить полный (проверить AbstractPlugin._handlePreloadComplete метод, который сохраняет загруженный ArrayBuffer в _audioSources хэш.

Вы должны сделать это для каждого звука. Как только звук зарегистрирован и у него есть необходимые данные для каждого идентификатора, API SoundJS должны работать.

Это интересный подход, и, возможно, имеет смысл добавить его в качестве запроса функции в SoundJS.

Другие вопросы по тегам