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