Использование PreloadJS и SoundJS в приложении React для предварительной загрузки звуков
Я пытаюсь использовать PreloadJS и SoundJS в приложении React для предварительной загрузки всех звуков, а затем воспроизводить их из предварительно загруженного кэша.
Я не могу понять, как создать LoadQueue и загрузить звуки в одном компоненте (верхний уровень: App.jsx
) и воспроизводить их в другом компоненте (потомок App.jsx
: Board.jsx
).
Прелоадер работает нормально, но я не могу воспроизвести звуки в дочернем компоненте. Когда я пытаюсь позвонить createjs.Sound.play()
Я продолжаю получать сообщения об ошибках, которые createjs.Sound
не определено Я думаю, что это как-то связано с тем, что я устанавливаю плагин Sound в одном компоненте, а затем пытаюсь получить к нему доступ в другом месте, но плагин Sound, кажется, подключен к самой LoadQueue, и я не думаю, что хочу новый LoadQueue в Board
составная часть? Что я делаю неправильно?
То, что я пробовал до сих пор, что не сработало:
- Изменение
webpack.config
в соответствии с инструкциями в этом ответе, который должен сделатьcreatejs
доступны в глобальном контексте - Определение
playSound
метод в моем компоненте верхнего уровня (где определено LoadQueue) и передача этого метода в качестве опоры дочернему компоненту, где я хочу воспроизвести звук.
asset_loader.js
import createjs from 'preload-js';
import manifest from '../sounds/asset_manifest.json';
const assetLoader = () => {
// Reset the UI
document.getElementById('progress').style.width = '0px';
// Create a preloader.
const preload = new createjs.LoadQueue();
preload.installPlugin(createjs.Sound);
const assetManifest = manifest.manifest;
// If there is an open preload queue, close it.
if (preload != null) {
preload.close();
}
// File complete handler
const handleFileLoad = (event) => {
console.log(`Preloaded: ${event.item.id}`);
};
// Overall progress handler
const handleOverallProgress = () => {
document.getElementById('progress').style.width = `${(preload.progress * document.getElementById('progress-wrap').clientWidth)}px`;
};
// Error handler
const handleFileError = (event) => {
console.log(`error: ${event.item.id}, ${event.text}`);
};
const handleComplete = () => {
console.log('loading complete');
};
preload.on('fileload', handleFileLoad);
preload.on('progress', handleOverallProgress);
preload.on('error', handleFileError);
preload.on('complete', handleComplete);
preload.setMaxConnections(5);
const loadAnother = () => {
// Get the next manifest item, and load it
const item = assetManifest.shift();
preload.loadFile(item);
};
const loadAll = () => {
while (assetManifest.length > 0) {
loadAnother();
}
};
loadAll();
};
export default assetLoader;
App.jsx
import React from 'react';
// …
import assetLoader from './utils/asset_loader';
class App extends React.Component {
componentDidMount() {
assetLoader();
}
// …
Board.jsx
// …
import createjs from 'preload-js';
//…
playSound(item) {
console.log(`playing sound: ${item}`);
createjs.Sound.play(item);
}
Сообщение об ошибке: Uncaught TypeError: Cannot read property 'play' of undefined