330 lines
No EOL
11 KiB
JavaScript
330 lines
No EOL
11 KiB
JavaScript
//=============================================================================
|
|
// Keke_SeamlessLikeTransfar - シームレス風場所移動
|
|
// バージョン: 1.0.2
|
|
//=============================================================================
|
|
// Copyright (c) 2023 ケケー
|
|
// Released under the MIT license
|
|
// http://opensource.org/licenses/mit-license.php
|
|
//=============================================================================
|
|
|
|
/*:
|
|
* @target MZ
|
|
* @plugindesc シームレス風の場所移動
|
|
* @author ケケー
|
|
* @url https://kekeelabo.com
|
|
*
|
|
* @help
|
|
* 【ver.1.0.2】
|
|
* シームレス風のなめらかな場所移動ができるようになる
|
|
*
|
|
*
|
|
* ● 使い方 ●
|
|
* ◎イベントコマンド『場所移動』をフェード「なし」で実行すると、
|
|
* 自動的にシームレス風場所移動になる
|
|
* フェード「黒」「白」の場合はそのまま
|
|
* ◎プラグインコマンドでフェード時間をいつでも変更できる
|
|
* フェード時間を 0 にすると、元のフェード「なし」と同じになる
|
|
* ◎フェード「黒」「白」のフェード時間も変更可能
|
|
*
|
|
*
|
|
* ● 利用規約 ●
|
|
* MITライセンスのもと、自由に使ってくれて大丈夫です
|
|
*
|
|
*
|
|
*
|
|
* @param シームレスフェード時間
|
|
* @desc シームレス風場所移動のフェード時間。5 なら 5フレーム。基本値 20
|
|
* @default 20
|
|
*
|
|
* @param 黒フェード時間
|
|
* @desc 黒フェード場所移動のフェード時間。5 なら 5フレーム。基本値 24
|
|
* @default
|
|
*
|
|
* @param 白フェード時間
|
|
* @desc 白フェード場所移動のフェード時間。5 なら 5フレーム。基本値 24
|
|
* @default
|
|
*
|
|
*
|
|
*
|
|
* @command シームレス風フェード時間
|
|
* @desc シームレス風場所移動のフェード時間を変更する
|
|
*
|
|
* @arg シームレス風フェード時間
|
|
* @desc シームレス風場所移動のフェード時間。5 なら 5フレーム。基本値 20
|
|
* @default
|
|
*
|
|
*
|
|
*
|
|
* @command 黒フェード時間
|
|
* @desc 黒フェード場所移動のフェード時間を変更する
|
|
*
|
|
* @arg 黒フェード時間
|
|
* @desc 黒フェード場所移動のフェード時間。5 なら 5フレーム。基本値 24
|
|
* @default
|
|
*
|
|
*
|
|
*
|
|
* @command 白フェード時間
|
|
* @desc 白フェード場所移動のフェード時間を変更する
|
|
*
|
|
* @arg 白フェード時間
|
|
* @desc 白フェード場所移動のフェード時間。5 なら 5フレーム。基本値 24
|
|
* @default
|
|
*/
|
|
|
|
|
|
|
|
(() => {
|
|
//- プラグイン名
|
|
const pluginName = document.currentScript.src.match(/^.*\/(.*).js$/)[1];
|
|
|
|
|
|
|
|
//==================================================
|
|
//-- スプライト追加 /ベーシック
|
|
//==================================================
|
|
|
|
|
|
//- 破棄付きスプライト
|
|
function SpriteKeSmtr() {
|
|
this.initialize(...arguments);
|
|
}
|
|
|
|
SpriteKeSmtr.prototype = Object.create(Sprite.prototype);
|
|
SpriteKeSmtr.prototype.constructor = SpriteKeSmtr;
|
|
|
|
SpriteKeSmtr.prototype.destroy = function() {
|
|
if (this.bitmap && !this.bitmap._url) { this.bitmap.destroy(); }
|
|
Sprite.prototype.destroy.apply(this);
|
|
};
|
|
|
|
|
|
|
|
//==================================================
|
|
//-- パラメータ受け取り
|
|
//==================================================
|
|
|
|
const parameters = PluginManager.parameters(pluginName);
|
|
|
|
const keke_seamlessFadeTime = Number(parameters["シームレスフェード時間"]);
|
|
const keke_blackFadeTime = Number(parameters["黒フェード時間"]);
|
|
const keke_whiteFadeTime = Number(parameters["白フェード時間"]);
|
|
|
|
|
|
|
|
//==================================================
|
|
//-- プラグインコマンド
|
|
//==================================================
|
|
|
|
//- シームレス風フェード時間
|
|
PluginManager.registerCommand(pluginName, "シームレス風フェード時間", args => {
|
|
const time = args["シームレス風フェード時間"];
|
|
if (!time) { return; }
|
|
// フェード時間の変更
|
|
changeFadeTime(Number(time), "seamless");
|
|
});
|
|
|
|
|
|
//- 黒フェード時間
|
|
PluginManager.registerCommand(pluginName, "黒フェード時間", args => {
|
|
const time = args["黒フェード時間"];
|
|
if (!time) { return; }
|
|
// フェード時間の変更
|
|
changeFadeTime(Number(time), "black");
|
|
});
|
|
|
|
|
|
//- 白フェード時間
|
|
PluginManager.registerCommand(pluginName, "白フェード時間", args => {
|
|
const time = args["白フェード時間"];
|
|
if (!time) { return; }
|
|
// フェード時間の変更
|
|
changeFadeTime(Number(time), "white");
|
|
});
|
|
|
|
|
|
//==================================================
|
|
//-- 共通開始
|
|
//==================================================
|
|
|
|
//- スプライトセット・マップ(コア追加)
|
|
const _Spriteset_Map_initialize = Spriteset_Map.prototype.initialize;
|
|
Spriteset_Map.prototype.initialize = function() {
|
|
_Spriteset_Map_initialize.apply(this);
|
|
// マップ移動後はシームレス風場所移動の開始2
|
|
if (inSeamlessTransfar()) {
|
|
startSeamlessTransfar2(this);
|
|
}
|
|
};
|
|
|
|
|
|
|
|
//==================================================
|
|
//-- 共通更新
|
|
//==================================================
|
|
|
|
//- スプライトセット・マップ(コア追加)
|
|
const _Spriteset_Map_updateParallax = Spriteset_Map.prototype.updateParallax;
|
|
Spriteset_Map.prototype.updateParallax = function() {
|
|
_Spriteset_Map_updateParallax.apply(this);
|
|
// シームレススナップ消去の更新
|
|
updateSeamlessSnapDel();
|
|
};
|
|
|
|
|
|
//==================================================
|
|
//-- 共通終了
|
|
//==================================================
|
|
|
|
//- シーンマップ(コア追加)
|
|
const _Scene_Map_terminate = Scene_Map.prototype.terminate;
|
|
Scene_Map.prototype.terminate = function() {
|
|
// マップ移動時はシームレス風場所移動の開始1
|
|
if ($gamePlayer._newMapId) {
|
|
startSeamlessTransfar1();
|
|
}
|
|
_Scene_Map_terminate.apply(this);
|
|
};
|
|
|
|
|
|
//- スプライトの破棄
|
|
function destroySprite(sprite, force) {
|
|
if (!sprite) { return; }
|
|
sprite.children.forEach(s => destroySprite(s));
|
|
if (sprite.bitmap && !sprite.bitmap._url) { sprite.bitmap.destroy(); }
|
|
if (sprite._texture) { sprite.destroy(); }
|
|
};
|
|
|
|
|
|
|
|
//==================================================
|
|
//-- シームレス風場所移動
|
|
//==================================================
|
|
|
|
let _inSeamlessTransfar = false;
|
|
let seamlessSnap = null;
|
|
|
|
|
|
//- シームレス風場所移動の初期化
|
|
function initSeamlessTransfar() {
|
|
if ($gameMap._fadeTimeKeSmtr) { return; }
|
|
$gameMap._fadeTimeKeSmtr = { seamless:keke_seamlessFadeTime, black:keke_blackFadeTime, white:keke_whiteFadeTime }
|
|
};
|
|
|
|
|
|
//- フェード時間の変更
|
|
function changeFadeTime(time, type = "seamless") {
|
|
// シームレス風場所移動の初期化
|
|
initSeamlessTransfar();
|
|
$gameMap._fadeTimeKeSmtr[type] = time;
|
|
};
|
|
|
|
|
|
//- フェード時間の取得
|
|
function getFadeTime(type = "seamless") {
|
|
// シームレス風場所移動の初期化
|
|
initSeamlessTransfar();
|
|
return $gameMap._fadeTimeKeSmtr[type];
|
|
};
|
|
|
|
|
|
//- シームレス風場所移動の開始1
|
|
function startSeamlessTransfar1(scene) {
|
|
// フェードなしでなければリターン
|
|
if ($gamePlayer._fadeType != 2) { return; }
|
|
_inSeamlessTransfar = true;
|
|
};
|
|
|
|
|
|
//- シームレス風場所移動の開始2
|
|
function startSeamlessTransfar2(spriteset) {
|
|
spriteset = spriteset || SceneManager._scene._spriteset;
|
|
SceneManager._scene._spriteset = spriteset;
|
|
// シームレス中フラグを消去
|
|
_inSeamlessTransfar = false;
|
|
// シームレススナップのセット
|
|
setSeamlessSnap(spriteset);
|
|
};
|
|
|
|
|
|
//- シームレススナップのセット
|
|
function setSeamlessSnap(spriteset) {
|
|
if (seamlessSnap) { return; }
|
|
// 画像と時間をセット
|
|
const fadeTime = getFadeTime("seamless");
|
|
seamlessSnap = { sprite:new SpriteKeSmtr(SceneManager._backgroundBitmap), time:fadeTime, count:fadeTime };
|
|
};
|
|
|
|
|
|
// シームレススナップ消去の更新
|
|
function updateSeamlessSnapDel() {
|
|
if (!seamlessSnap) { return; }
|
|
// バグ防止に古いスナップが残っていたら破棄
|
|
if (!seamlessSnap.sprite.transform) {
|
|
destroySeamlessSnap();
|
|
return;
|
|
}
|
|
// スナップをチルド
|
|
SceneManager._scene.addChild(seamlessSnap.sprite);
|
|
// カウントを減らす
|
|
seamlessSnap.count--;
|
|
seamlessSnap.sprite.opacity -= 255 / seamlessSnap.time;
|
|
// カウント 0 になったらシームレススナップの破棄
|
|
if (seamlessSnap.count <= 0) {
|
|
destroySeamlessSnap();
|
|
}
|
|
};
|
|
|
|
|
|
// シームレススナップの破棄
|
|
function destroySeamlessSnap() {
|
|
destroySprite(seamlessSnap.sprite);
|
|
seamlessSnap = null;
|
|
};
|
|
|
|
|
|
//- シームレス風場所移動中か
|
|
function inSeamlessTransfar() {
|
|
return _inSeamlessTransfar;
|
|
};
|
|
|
|
|
|
|
|
//==================================================
|
|
//-- 黒白フェード時間の変更
|
|
//==================================================
|
|
|
|
//- フェードイン時間の変更
|
|
const _Scene_Base_startFadeIn = Scene_Base.prototype.startFadeIn;
|
|
Scene_Base.prototype.startFadeIn = function(duration, white) {
|
|
// フェード時間の取得-黒白
|
|
if (this.constructor.name == "Scene_Map") {
|
|
const time = getFadeTime_colored(white);
|
|
if (time) { duration = time; }
|
|
}
|
|
_Scene_Base_startFadeIn.call(this, duration, white);
|
|
};
|
|
|
|
//- フェードアウト時間の変更
|
|
const _Scene_Base_startFadeOut = Scene_Base.prototype.startFadeOut;
|
|
Scene_Base.prototype.startFadeOut = function(duration, white) {
|
|
// フェード時間の取得-黒白
|
|
if (this.constructor.name == "Scene_Map") {
|
|
const time = getFadeTime_colored(white);
|
|
if (time) { duration = time; }
|
|
}
|
|
_Scene_Base_startFadeOut.call(this, duration, white);
|
|
};
|
|
|
|
|
|
//- フェード時間の取得-黒白
|
|
function getFadeTime_colored(white) {
|
|
// シームレス風場所移動の初期化
|
|
initSeamlessTransfar();
|
|
// タイプ別に時間を取得
|
|
const type = white ? "white" : "black";
|
|
return getFadeTime(type);
|
|
};
|
|
|
|
|
|
})(); |