169 lines
6.1 KiB
JavaScript
169 lines
6.1 KiB
JavaScript
//=============================================================================
|
|
// RPG Maker MZ - AsyncLoadImage
|
|
//
|
|
// Copyright 2024 Panzer-IV. All rights reserved.
|
|
// This source code or any portion thereof must not be
|
|
// reproduced or used without licensed in any manner whatsoever.
|
|
//=============================================================================
|
|
/*:
|
|
* @target MZ
|
|
* @plugindesc 画像の非同期読み込みプラグイン
|
|
* @author 四号戦車
|
|
* @base PluginCommonBase
|
|
* @orderAfter PluginCommonBase
|
|
*
|
|
* @help AsyncLoadImage.js
|
|
*
|
|
* Version: 0.0.1
|
|
*
|
|
* ImageManagerのBitmapローディングは非同期なので困る場面があるため、
|
|
* コールバック地獄回避のためにPromiseで返す処理を追加するプラグイン
|
|
*
|
|
*/
|
|
(() => {
|
|
"use strict";
|
|
|
|
const pluginName = "AsyncLoadImage";
|
|
const script = document.currentScript;
|
|
const param = PluginManagerEx.createParameter(script);
|
|
|
|
//========================================================================
|
|
// モジュールインポート
|
|
//========================================================================
|
|
const fs = require('fs');
|
|
|
|
/********************************************************************************************************
|
|
* 共有基盤
|
|
********************************************************************************************************/
|
|
const log = (text) => {
|
|
if (DebugSwitch.isEnable()) {
|
|
console.log(text);
|
|
}
|
|
};
|
|
|
|
const fileExists = (path) => {
|
|
try {
|
|
const realPath = Utils.hasEncryptedImages() ? `${path}_` : path;
|
|
fs.accessSync(realPath, fs.constants.R_OK);
|
|
return true;
|
|
} catch (err) {
|
|
Logger.w(`cannot access: path = ${path}, err = ${err}`);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
/********************************************************************************************************
|
|
* ImageManagerへのfunction追加
|
|
********************************************************************************************************/
|
|
const _Bitmap_prototype_initialize = Bitmap.prototype.initialize;
|
|
Bitmap.prototype.initialize = function(width, height) {
|
|
_Bitmap_prototype_initialize.apply(this, arguments);
|
|
this._errorListeners = [];
|
|
}
|
|
|
|
Bitmap.prototype.addErrorListener = function(listner) {
|
|
if (this._loadingState !== "error") {
|
|
this._errorListeners.push(listner);
|
|
} else {
|
|
listner(this);
|
|
}
|
|
};
|
|
|
|
const _Bitmap_prototype__onError = Bitmap.prototype._onError;
|
|
Bitmap.prototype._onError = function() {
|
|
_Bitmap_prototype__onError.apply(this, arguments);
|
|
while (this._errorListeners.length > 0) {
|
|
const listener = this._errorListeners.shift();
|
|
listener(this);
|
|
}
|
|
}
|
|
|
|
/********************************************************************************************************
|
|
* ImageManagerへのfunction追加
|
|
********************************************************************************************************/
|
|
ImageManager.loadAnimationAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/animations/", filename);
|
|
};
|
|
|
|
ImageManager.loadBattleback1Async = function(filename) {
|
|
return this.loadBitmapAsync("img/battlebacks1/", filename);
|
|
};
|
|
|
|
ImageManager.loadBattleback2Async = function(filename) {
|
|
return this.loadBitmapAsync("img/battlebacks2/", filename);
|
|
};
|
|
|
|
ImageManager.loadEnemyAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/enemies/", filename);
|
|
};
|
|
|
|
ImageManager.loadCharacterAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/characters/", filename);
|
|
};
|
|
|
|
ImageManager.loadFaceAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/faces/", filename);
|
|
};
|
|
|
|
ImageManager.loadParallaxAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/parallaxes/", filename);
|
|
};
|
|
|
|
ImageManager.loadPictureAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/pictures/", filename);
|
|
};
|
|
|
|
ImageManager.loadSvActorAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/sv_actors/", filename);
|
|
};
|
|
|
|
ImageManager.loadSvEnemyAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/sv_enemies/", filename);
|
|
};
|
|
|
|
ImageManager.loadSystemAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/system/", filename);
|
|
};
|
|
|
|
ImageManager.loadTilesetAsync = function(filename) {
|
|
return this.loadBitmapAsync("img/tilesets/", filename);
|
|
};
|
|
|
|
ImageManager.loadTitle1Async = function(filename) {
|
|
return this.loadBitmapAsync("img/titles1/", filename);
|
|
};
|
|
|
|
ImageManager.loadTitle2Async = function(filename) {
|
|
return this.loadBitmapAsync("img/titles2/", filename);
|
|
};
|
|
|
|
ImageManager.loadBitmapAsync = function(folder, filename) {
|
|
if (!!filename) {
|
|
const url = folder + Utils.encodeURI(filename) + ".png";
|
|
return this.loadBitmapFromUrlAsync(url);
|
|
} else {
|
|
return Promise.resolve(this._emptyBitmap);
|
|
}
|
|
}
|
|
|
|
ImageManager.loadBitmapFromUrlAsync = function(url) {
|
|
return new Promise((resolve, reject) => {
|
|
const cache = url.includes("/system/") ? this._system : this._cache;
|
|
if (!cache[url] || !cache[url]._baseTexture) {
|
|
if (fileExists(decodeURIComponent(url))) {
|
|
const bitmap = Bitmap.load(url);
|
|
cache[url] = bitmap;
|
|
bitmap.addLoadListener(() => {
|
|
resolve(bitmap);
|
|
});
|
|
bitmap.addErrorListener(() => reject(bitmap));
|
|
} else {
|
|
reject(`file does not exists, url = ${decodeURIComponent(url)}`);
|
|
}
|
|
} else {
|
|
resolve(cache[url]);
|
|
}
|
|
});
|
|
};
|
|
|
|
})();
|