avg-core-ts
Version:
Develop Adventure Game (or ADV, Visual Novel, Galgame, etc.) on your own!
132 lines (103 loc) • 3.48 kB
JavaScript
/**
* @file General resource preloader class
* @author MicroMatrix <yangpan.1985@bytedance.com>
* @copyright 2012-2020 bytedance
* @link git@code.byted.org:yangpan.1985/avg.git
*/
const PIXI = require('pixi.js');
let TEXTURES = {};
const AUDIOS = {};
const VIDEOS = {};
// const SCRIPTS = {};
let HOST = '/';
let TRYWEBP = false;
const isSafari = ((navigator.userAgent.indexOf('Safari') !== -1)
&& (navigator.userAgent.indexOf('Chrome') === -1)
&& navigator.userAgent.indexOf('Android') === -1)
|| navigator.userAgent.indexOf('iPhone') !== -1
|| navigator.userAgent.indexOf('iPad') !== -1;
const Resource = PIXI.loaders.Loader.Resource;
Resource.setExtensionLoadType('wav', Resource.LOAD_TYPE.AUDIO);
Resource.setExtensionLoadType('mp3', Resource.LOAD_TYPE.AUDIO);
Resource.setExtensionLoadType('ogg', Resource.LOAD_TYPE.AUDIO);
Resource.setExtensionLoadType('mp4', Resource.LOAD_TYPE.VIDEO);
Resource.setExtensionLoadType('webm', Resource.LOAD_TYPE.VIDEO);
Resource.setExtensionXhrType('bkc', Resource.XHR_RESPONSE_TYPE.JSON);
Resource.setExtensionXhrType('bks', Resource.XHR_RESPONSE_TYPE.TEXT);
Resource.setExtensionXhrType('ttf', Resource.XHR_RESPONSE_TYPE.BUFFER);
Resource.setExtensionXhrType('otf', Resource.XHR_RESPONSE_TYPE.BUFFER);
function changeExtension(filename, ext) {
const basename = filename.substr(0, filename.lastIndexOf('.'));
return `${basename}.${ext}`;
}
export function init(host, tryWebp) {
TEXTURES = {};
HOST = host || HOST;
TRYWEBP = !!tryWebp;
}
export function load(resources, onProgress) {
const loader = new PIXI.loaders.Loader(HOST);
if (resources && resources.length) {
for (const res of [...new Set(resources)]) {
if (isSafari || !TRYWEBP) {
loader.add(res, res);
} else {
loader.add(res, changeExtension(res, 'webp'));
}
}
const promise = new Promise((resolve, reject) => {
loader.once('complete', resolve);
loader.once('error', reject);
loader.on('progress', onProgress);
});
loader.load((loader, resources) => {
// `resources` is a Object
for (const name in resources) {
const res = resources[name];
if (res.type === Resource.TYPE.IMAGE || res.isImage) {
TEXTURES[name] = res.texture;
} else if (res.type === Resource.TYPE.AUDIO || res.isAudio) {
// audio object
AUDIOS[name] = res.data;
} else if (res.type === Resource.TYPE.VIDEO || res.isVideo) {
VIDEOS[name] = res.data;
}
}
// Object.assign(TEXTURES, resources);
});
return promise;
} else {
return Promise.resolve();
}
}
export function getTexture(url = '') {
let obj = TEXTURES[url];
if (!obj) {
if (url.startsWith('data:')
|| url.startsWith('http:')
|| url.startsWith('https:')) {
obj = PIXI.Texture.fromImage(url);
} else {
let _url;
if (url) {
_url = (isSafari || !TRYWEBP) ? `${HOST}${url}` : changeExtension(`${HOST}${url}`, 'webp');
} else {
_url = '';
}
obj = PIXI.Texture.fromImage(_url);
}
TEXTURES[url] = obj;
}
return new PIXI.Texture(obj.baseTexture);
}
export function getAudio(url) {
const obj = AUDIOS[url];
if (obj) {
return obj;
}
const audio = new Audio();
audio.src = `${HOST}${url}`;
audio.preload = 'auto';
audio.load();
return audio;
}