UNPKG

avg-core-ts

Version:

Develop Adventure Game (or ADV, Visual Novel, Galgame, etc.) on your own!

132 lines (103 loc) 3.48 kB
/** * @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; }