143 lines
No EOL
4.4 KiB
JavaScript
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();
|
|
};
|
|
|
|
|
|
})(); |