retrolib
Version:
Render low-res scenes to the canvas in a retro 8-bit era style. Aseprite exported animation wrapper, scene management, sound and image management, particle support.
98 lines • 3.38 kB
JavaScript
import SfxDefinition from "./SfxDefinition";
var sfxVolume = 0.45;
export function setVolume(name, volume) {
var sfx = sfxs.filter(function (f) { return f.name === name; });
if (sfx.length > 0) {
sfx[0].sfx.volume = volume;
}
}
export function setGlobalVolume(volume) {
sfxVolume = volume;
sfxs.forEach(function (sfx) { return sfx.sfx.volume = volume; });
}
var sfxs = [];
/**
* Populate sfx manifest with JSON list of definitions. Manifest is an arry of
* objects matching format { "name": "sfx id ref", "filename": "./file_path/filename.ext" },
* @param json JSON representation of image definitions.
*/
function sfxManifestFromJSON(json) {
json.forEach((function (def) { return sfxs.push(SfxDefinition.fromJSON(def)); }));
}
export function addSfxToManifest(sfxName, filename) {
var sfx = { filename: filename, sfx: null, name: sfxName };
sfxs.push(sfx);
}
function isPlaying(name) {
var sf = getSfx(name);
if (sf) {
return !sf.paused || sf.currentTime && sf.currentTime < sf.duration;
}
return false;
}
function getSfx(name) {
var sf = sfxs.filter(function (f) { return f.name === name; });
return sf.length > 0 ? sf[0].sfx : null;
}
function playSfx(name, onEnded) {
onEnded = onEnded === undefined ? function () { } : onEnded;
return new Promise(function (resolve) {
try {
var sf_1 = sfxs.filter(function (f) { return f.name === name; });
if (sf_1.length > 0) {
if (!isPlaying(name)) {
sf_1[0].sfx.volume = sfxVolume;
if (onEnded) {
sf_1[0].sfx.onended = function () {
onEnded(sf_1[0]);
sf_1[0].sfx.onended = function () { resolve(); };
};
}
else {
sf_1[0].sfx.onended = function () { resolve(); };
}
sf_1[0].sfx.play();
}
else {
sf_1[0].sfx.currentTime = 0;
}
}
}
catch (e) {
console.log('Error playing sfx', name, e);
}
});
}
function loadSfx(filename) {
return new Promise(function (resolve, reject) {
var sf = new Audio(filename);
sf.oncanplaythrough = function () {
resolve(sf);
};
sf.onerror = function (e) {
console.error("Failed to load file ".concat(filename, ":"), e);
reject(e);
};
});
}
function loadAllSfx() {
return new Promise(function (resolveAll, rejectAll) {
var promises = [];
var _loop_1 = function (i) {
var sfx = sfxs[i];
promises.push(new Promise(function (resolve) { return loadSfx(sfx.filename).then(function (r) {
sfx.sfx = r;
resolve(r);
}).catch(function (e) {
console.error('Failed to load', sfx.filename, e);
rejectAll('Failed to load' + sfx.filename + ':' + JSON.stringify(e));
}); }));
};
for (var i in sfxs) {
_loop_1(i);
}
return Promise.allSettled(promises);
});
}
export { loadAllSfx, loadSfx, playSfx, getSfx, isPlaying, sfxManifestFromJSON };
//# sourceMappingURL=sfx.js.map