/*---------------------------------------------------------------------------* * 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, }; } })(); })();