lust-oni/www/js/plugins/Torigoya_FrameTween.js
2025-10-26 23:43:42 -05:00

375 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------*
* Torigoya_FrameTween.js v.2.1.0
*---------------------------------------------------------------------------*
* 2021/05/12 01:00 (JST)
*---------------------------------------------------------------------------*
* Ruたん ( @ru_shalm )
* https://torigoya-plugin.rutan.dev
*---------------------------------------------------------------------------*/
/*:
* @target MV
* @plugindesc [Base] Tween-animation Engine (v.2.1.0)
* @author Rutan(ru_shalm)
* @license public domain
* @version 2.1.0
* @url https://raw.githubusercontent.com/rutan/torigoya-rpg-maker-plugin/gh-pages/Torigoya_FrameTween.js
* @help
* [Base] Tween-animation Engine (v.2.1.0)
* https://torigoya-plugin.rutan.dev
*
* This plugin is a base-plugin for Torigoya plugins.
*/
/*:ja
* @target MV
* @plugindesc [鳥小屋.txt ベースプラグイン] Tweenアニメーション (v.2.1.0)
* @author Ruたんru_shalm
* @license public domain
* @version 2.1.0
* @url https://raw.githubusercontent.com/rutan/torigoya-rpg-maker-plugin/gh-pages/Torigoya_FrameTween.js
* @help
* [鳥小屋.txt ベースプラグイン] Tweenアニメーション (v.2.1.0)
* https://torigoya-plugin.rutan.dev
*
* このプラグインはベースプラグインです。
* このプラグインを導入しただけでは特に何も起きません。
* Tweenアニメーション用の処理を追加します。
*/
(function () {
'use strict';
var linear = function (n) {
return n;
};
var easeInSine = function (n) {
return 1 - Math.cos((n * Math.PI) / 2);
};
var easeOutSine = function (n) {
return Math.sin((n * Math.PI) / 2);
};
var easeInOutSine = function (n) {
return (1 - Math.cos(n * Math.PI)) / 2;
};
var easeInQuad = function (n) {
return n * n;
};
var easeOutQuad = function (n) {
return n * (2 - n);
};
var easeInOutQuad = function (n) {
n *= 2;
if (n < 1) {
return (n * n) / 2;
} else {
--n;
return (1 + n * (2 - n)) / 2;
}
};
var easeInCubic = function (n) {
return Math.pow(n, 3);
};
var easeOutCubic = function (n) {
--n;
return Math.pow(n, 3) + 1;
};
var easeInOutCubic = function (n) {
n *= 2;
if (n < 1) {
return Math.pow(n, 3) / 2;
} else {
n -= 2;
return (Math.pow(n, 3) + 2) / 2;
}
};
var easeInCircular = function (n) {
return 1 - Math.sqrt(1 - n * n);
};
var easeOutCircular = function (n) {
n--;
return Math.sqrt(1 - n * n);
};
var easeInOutCircular = function (n) {
n *= 2;
if (n < 1) {
return -(Math.sqrt(1 - n * n) - 1) / 2;
} else {
n -= 2;
return (Math.sqrt(1 - n * n) + 1) / 2;
}
};
var Easing = /*#__PURE__*/ Object.freeze({
__proto__: null,
linear: linear,
easeInSine: easeInSine,
easeOutSine: easeOutSine,
easeInOutSine: easeInOutSine,
easeInQuad: easeInQuad,
easeOutQuad: easeOutQuad,
easeInOutQuad: easeInOutQuad,
easeInCubic: easeInCubic,
easeOutCubic: easeOutCubic,
easeInOutCubic: easeInOutCubic,
easeInCircular: easeInCircular,
easeOutCircular: easeOutCircular,
easeInOutCircular: easeInOutCircular,
});
var Group = /** @class */ (function () {
function Group() {
this._items = [];
}
Object.defineProperty(Group.prototype, 'length', {
get: function () {
return this._items.length;
},
enumerable: false,
configurable: true,
});
Group.prototype.clear = function () {
this._items.forEach(function (_a) {
var tween = _a[0],
_ = _a[1];
return tween.abort();
});
this._items.length = 0;
};
Group.prototype.add = function (tween) {
var state = {
startParams: {},
finishParams: {},
duration: 0,
easingFunc: linear,
timer: 0,
isWaitingCallback: false,
};
if (!this._beginAnimation(tween, state)) return;
this._items.push([tween, state]);
};
Group.prototype.remove = function (tween) {
this._items = this._items.filter(function (_a) {
var t = _a[0],
_ = _a[1];
return t !== tween;
});
};
Group.prototype.update = function () {
var _this = this;
var items = this._items.slice();
this._items.length = 0;
this._items = items
.filter(function (_a) {
var tween = _a[0],
state = _a[1];
if (tween.finished) return false;
if (state.isWaitingCallback) return true;
++state.timer;
if (state.timer < state.duration) {
var n_1 = state.easingFunc(state.timer / state.duration);
Object.keys(state.finishParams).forEach(function (key) {
tween.target[key] =
state.startParams[key] + (state.finishParams[key] - state.startParams[key]) * n_1;
});
} else {
Object.keys(state.finishParams).forEach(function (key) {
tween.target[key] = state.finishParams[key];
});
}
var result = state.timer < state.duration || _this._beginAnimation(tween, state);
tween.callUpdateListeners();
if (!result) tween.abort();
return result;
})
.concat(this._items);
};
Group.prototype._beginAnimation = function (tween, state) {
var _loop_1 = function () {
var stack = tween.stacks.shift();
if (!stack) return { value: false };
switch (stack.type) {
case 'call':
if (stack.func.length === 0) {
stack.func();
} else {
state.isWaitingCallback = true;
stack.func(function () {
return (state.isWaitingCallback = false);
});
}
if (state.isWaitingCallback) {
return { value: true };
} else {
break; // loop!
}
case 'move': {
var startParams_1 = {};
Object.keys(stack.params).forEach(function (key) {
startParams_1[key] = tween.target[key];
});
state.startParams = startParams_1;
state.finishParams = stack.params;
state.duration = stack.duration;
state.easingFunc = stack.easingFunc;
state.timer = 0;
return { value: true };
}
}
};
while (true) {
var state_1 = _loop_1();
if (typeof state_1 === 'object') return state_1.value;
}
};
return Group;
})();
var Tween = /** @class */ (function () {
function Tween(target, initialParams) {
this._target = target;
this._stacks = [];
this._group = null;
this._onUpdateListeners = [];
this._finished = false;
if (initialParams) {
Object.keys(initialParams).forEach(function (key) {
target[key] = initialParams[key];
});
}
}
Tween.create = function (target, initialParams) {
return new Tween(target, initialParams);
};
Tween.update = function () {
Tween._globalGroup.update();
};
Object.defineProperty(Tween.prototype, 'stacks', {
get: function () {
return this._stacks;
},
enumerable: false,
configurable: true,
});
Object.defineProperty(Tween.prototype, 'target', {
get: function () {
return this._target;
},
enumerable: false,
configurable: true,
});
Object.defineProperty(Tween.prototype, 'finished', {
get: function () {
return this._finished;
},
enumerable: false,
configurable: true,
});
Tween.prototype.group = function (group) {
this._group = group;
return this;
};
Tween.prototype.addUpdateListener = function (func) {
this._onUpdateListeners.push(func);
return this;
};
Tween.prototype.removeUpdateListener = function (func) {
this._onUpdateListeners = this._onUpdateListeners.filter(function (f) {
return f !== func;
});
return this;
};
Tween.prototype.callUpdateListeners = function () {
this._onUpdateListeners.forEach(function (f) {
return f();
});
};
Tween.prototype.to = function (params, duration, easingFunc) {
this._stacks.push({
type: 'move',
params: params,
duration: duration,
easingFunc: easingFunc || linear,
});
return this;
};
Tween.prototype.wait = function (duration) {
this._stacks.push({
type: 'move',
params: {},
duration: duration,
easingFunc: linear,
});
return this;
};
Tween.prototype.call = function (func) {
this._stacks.push({
type: 'call',
func: func,
});
return this;
};
Tween.prototype.start = function () {
if (!this._group) {
this._group = Tween._globalGroup;
}
this._group.add(this);
return this;
};
Tween.prototype.abort = function () {
this._stacks.length = 0;
this._finished = true;
return this;
};
Tween._globalGroup = new Group();
return Tween;
})();
const Torigoya = (window.Torigoya = window.Torigoya || {});
function getPluginName() {
const cs = document.currentScript;
return cs ? cs.src.split('/').pop().replace(/\.js$/, '') : 'Torigoya_FrameTween';
}
function readParameter() {
const parameter = PluginManager.parameters(getPluginName());
return {
version: '2.1.0',
};
}
Torigoya.FrameTween = {
name: getPluginName(),
parameter: readParameter(),
Tween,
Group,
Easing,
group: Tween._globalGroup,
create: Tween.create,
};
(() => {
const upstream_updateScene = SceneManager.updateScene;
SceneManager.updateScene = function () {
upstream_updateScene.apply(this);
if (this._scene) Torigoya.FrameTween.group.update();
};
// Torigoya_Tween.js簡易互換機能
if (!Torigoya.Tween) {
Torigoya.Tween = {
create: Torigoya.FrameTween.create,
Easing: Torigoya.FrameTween.Easing,
};
}
})();
})();