kakuriyo/js/plugins/TRP_SpriteSheets.js
2023-06-29 14:42:52 -05:00

143 lines
No EOL
4.4 KiB
JavaScript

//=============================================================================
// TRP_SpriteSheets.js
//=============================================================================
// Copyright (c) 2020 Thirop
//=============================================================================
/*:
* @target MZ
* @author Thirop
* @plugindesc スプライトシート機能の提供
* @help
* TRP_SkitMZにて階層レイヤー方式の画像形式で
* スプライトシート化した表情画像を使用する際に必要な
* プラグインです。
*
* 【更新履歴】
* 1.01 2022/2/27 画像読み込みが遅れた際のエラー修正
* 1.00 2020/11/10 初版
*/
var TRP_SpriteSheet = function () { };
(() => {
'use strict';
var _DataManager_loadDatabase = DataManager.loadDatabase;
DataManager.loadDatabase = function () {
_DataManager_loadDatabase.call(this);
TRP_SpriteSheet.setup()
};
var _DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!_DataManager_isDatabaseLoaded.call(this)) return false;
if (!TRP_SpriteSheet.isReady()) return false;
return true;
};
//=============================================================================
// TRP_SpriteSheet
//=============================================================================
TRP_SpriteSheet._loadingCount = 0;
TRP_SpriteSheet.data = {};
TRP_SpriteSheet.setup = function () {
};
TRP_SpriteSheet.load = function (file, completion = null) {
if (this.data[file]) return;
this._loadingCount += 1;
file = file.replace('.json', '');
var xhr = new XMLHttpRequest();
var url = 'dataEx/spritesheets/' + file + '.json';
xhr.open('GET', url);
xhr.overrideMimeType('application/json');
xhr.onload = this._onLoad.bind(this, file, xhr, completion);
xhr.onerror = this._onError.bind(this, url);
xhr.send();
};
TRP_SpriteSheet._onLoad = function (file, xhr, completion = null) {
if (xhr.status < 400) {
this.data[file] = JSON.parse(xhr.responseText);;
}
this._loadingCount -= 1;
if (completion) {
completion();
}
};
TRP_SpriteSheet._onError = function (url) {
DataManager._errorUrl = DataManager._errorUrl || url;
};
TRP_SpriteSheet.isReady = function () {
return this._loadingCount === 0;
};
//=============================================================================
// Sprite
//=============================================================================
Sprite.prototype.setupWithSheet = function (sheet, image, bitmap) {
if (!this.bitmap) return;
if (bitmap && this.bitmap !== bitmap) return;
if (!this.bitmap.isReady()) {
this.bitmap.addLoadListener(this.setupWithSheet.bind(this, sheet, image));
return;
}
if (!TRP_SpriteSheet.data[sheet]) {
throw new Error('spritesheet not loaded:' + sheet)
}
var data = TRP_SpriteSheet.data[sheet].frames[image];
if (!data) {
throw new Error('spritesheet image data not found:' + sheet + '>' + image);
}
var rect = data.frame;
if (!rect) return;
var frame = null;
var trim = null;
var sourceSize = data.trimmed !== false && data.sourceSize
? data.sourceSize : data.frame;
var orig = new Rectangle(0, 0, Math.floor(sourceSize.w), Math.floor(sourceSize.h));
if (data.rotated) {
frame = new Rectangle(Math.floor(rect.x), Math.floor(rect.y), Math.floor(rect.h), Math.floor(rect.w));
}
else {
frame = new Rectangle(Math.floor(rect.x), Math.floor(rect.y), Math.floor(rect.w), Math.floor(rect.h));
}
// Check to see if the sprite is trimmed
if (data.trimmed !== false && data.spriteSourceSize) {
trim = new Rectangle(Math.floor(data.spriteSourceSize.x), Math.floor(data.spriteSourceSize.y), Math.floor(rect.w), Math.floor(rect.h));
}
this._frame = frame;
this.texture.trim = trim;
this.texture.orig = orig;
this.texture._rotate = data.rotated ? 2 : 0;
this.texture.frame = frame.clone();
this.texture.updateUvs();
};
})();