392 lines
9.9 KiB
JavaScript
392 lines
9.9 KiB
JavaScript
//=============================================================================
|
||
// KMS_WaterMapEffect.js
|
||
// last update: 2017/01/01
|
||
//=============================================================================
|
||
|
||
/*
|
||
* This plugin can be used in the environment which supports WebGL.
|
||
*/
|
||
|
||
/*:
|
||
* @plugindesc
|
||
* [v1.1.0] Applies water effect.
|
||
*
|
||
* @author TOMY (Kamesoft)
|
||
*
|
||
* @param Flicker image
|
||
* @default KMS_cloud
|
||
* @require 1
|
||
* @dir img/system/
|
||
* @type file
|
||
* @desc The image which is used for flicker effect.
|
||
*
|
||
* @param Wave image
|
||
* @default KMS_wave
|
||
* @require 1
|
||
* @dir img/system/
|
||
* @type file
|
||
* @desc The image which is used for wave.
|
||
*
|
||
* @param Wave opacity
|
||
* @default 64
|
||
* @desc Opacity for wave. Range is from 0 to 255.
|
||
*
|
||
* @param Speed X
|
||
* @default -1.0
|
||
* @desc The offset value for the X coordinate.
|
||
*
|
||
* @param Speed Y
|
||
* @default 0.5
|
||
* @desc The offset value for the Y coordinate.
|
||
*
|
||
* @param Auto tone change
|
||
* @default 1
|
||
* @desc
|
||
* Color filter is applied automatically.
|
||
* 0: Disable, 1: Enable
|
||
*
|
||
* @help This plugin does not provide plugin commands.
|
||
*/
|
||
|
||
/*:ja
|
||
* @plugindesc
|
||
* [v1.1.0] マップに水中エフェクトを適用します。
|
||
*
|
||
* @author TOMY (Kamesoft)
|
||
*
|
||
* @param Flicker image
|
||
* @default KMS_cloud
|
||
* @require 1
|
||
* @dir img/system/
|
||
* @type file
|
||
* @desc 水の揺らぎを表現するための画像です。
|
||
*
|
||
* @param Wave image
|
||
* @default KMS_wave
|
||
* @require 1
|
||
* @dir img/system/
|
||
* @type file
|
||
* @desc 水面の波を表現するための画像です。
|
||
*
|
||
* @param Wave opacity
|
||
* @default 64
|
||
* @desc 波の不透明度です。0 ~ 255 で指定します。
|
||
*
|
||
* @param Speed X
|
||
* @default -1.0
|
||
* @desc 水の横方向への移動速度です。
|
||
*
|
||
* @param Speed Y
|
||
* @default 0.5
|
||
* @desc 水の縦方向への移動速度です。
|
||
*
|
||
* @param Auto tone change
|
||
* @default 1
|
||
* @desc
|
||
* 水中エフェクト時、画面の色調を自動的に変更します。
|
||
* 0: オフ, 1: オン
|
||
*
|
||
* @help このプラグインには、プラグインコマンドはありません。
|
||
*/
|
||
|
||
var KMS = KMS || {};
|
||
|
||
(function()
|
||
{
|
||
|
||
if (!Graphics.hasWebGL())
|
||
{
|
||
console.error("WebGL をサポートしていないため、フィルターを使用できません。");
|
||
return;
|
||
}
|
||
|
||
KMS.imported = KMS.imported || {};
|
||
KMS.imported['WaterMapEffect'] = true;
|
||
|
||
var PixiVersion = PIXI.DisplacementFilter ? 2 : 4;
|
||
|
||
var pluginParams = PluginManager.parameters('KMS_WaterMapEffect');
|
||
var Param = {};
|
||
Param.imageDir = 'img/system/';
|
||
Param.dispImage = pluginParams['Flicker image'] || 'KMS_cloud';
|
||
Param.waveImage = pluginParams['Wave image'] || 'KMS_wave';
|
||
Param.waveOpacity = Number(pluginParams['Wave opacity'] || 176);
|
||
Param.speed = {
|
||
x: Number(pluginParams['Speed X'] || -1.0),
|
||
y: Number(pluginParams['Speed Y'] || 0.5)
|
||
};
|
||
Param.autoTone = Boolean(Number(pluginParams['Auto tone change'] || 1));
|
||
Param.filterMode = 0;
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// KMS_WaterEffect
|
||
|
||
KMS_WaterEffect = function()
|
||
{
|
||
this._speed = { x: Param.speed.x, y: Param.speed.y };
|
||
this._colorFilter = (PixiVersion == 2) ?
|
||
new PIXI.ColorMatrixFilter() :
|
||
new PIXI.filters.ColorMatrixFilter();
|
||
if (Param.autoTone)
|
||
{
|
||
if (PixiVersion == 2)
|
||
{
|
||
this._colorFilter.matrix = [
|
||
0.9, 0, 0, 0,
|
||
0, 0.9, 0, 0,
|
||
0.2, 0.2, 1, 0,
|
||
0, 0, 0, 1
|
||
];
|
||
}
|
||
else
|
||
{
|
||
// For Pixi v4
|
||
this._colorFilter.matrix = [
|
||
0.9, 0, 0, 0, 0,
|
||
0, 0.9, 0, 0, 0,
|
||
0.2, 0.2, 1, 0, 0,
|
||
0, 0, 0, 1, 0
|
||
];
|
||
}
|
||
}
|
||
|
||
if (PixiVersion == 4)
|
||
{
|
||
this._dispSprite = new Sprite();
|
||
}
|
||
|
||
this._waveSprite = new TilingSprite();
|
||
this._waveSprite.blendMode = Graphics.BLEND_ADD;
|
||
this._waveSprite.opacity = Param.waveOpacity;
|
||
this._waveSprite.scale.x = 1.0;
|
||
this._waveSprite.scale.y = 1.0;
|
||
|
||
var margin = 24;
|
||
this._waveSprite.move(-margin, -margin, Graphics.width + margin, Graphics.height + margin);
|
||
};
|
||
|
||
/*
|
||
* 画像のロード
|
||
*/
|
||
KMS_WaterEffect.prototype.loadImage = function()
|
||
{
|
||
this._dispBitmap = ImageManager.loadBitmap(Param.imageDir, Param.dispImage, 0);
|
||
this._waveBitmap = ImageManager.loadBitmap(Param.imageDir, Param.waveImage, 0);
|
||
};
|
||
|
||
/*
|
||
* ロード完了判定
|
||
*/
|
||
KMS_WaterEffect.prototype.isReady = function()
|
||
{
|
||
return this._dispBitmap.isReady() && this._waveBitmap.isReady();
|
||
};
|
||
|
||
/*
|
||
* エフェクトの生成
|
||
*
|
||
* ※ 必ず画像のロードが完了した後に呼ぶこと
|
||
*/
|
||
KMS_WaterEffect.prototype.createEffect = function()
|
||
{
|
||
if (this._dispFilter)
|
||
{
|
||
return;
|
||
}
|
||
|
||
console.assert(this.isReady());
|
||
|
||
if (PixiVersion == 2)
|
||
{
|
||
this._dispFilter = new PIXI.DisplacementFilter(this._dispBitmap);
|
||
}
|
||
else
|
||
{
|
||
// For Pixi v4
|
||
// Pixi v4 の DisplacementFilter では自動でリピートされないので、WRAP_MODE 指定が必要。
|
||
this._dispBitmap.baseTexture.wrapMode = PIXI.WRAP_MODES.REPEAT;
|
||
this._dispSprite.bitmap = this._dispBitmap;
|
||
this._dispSprite.scale.x = Graphics.width / this._dispBitmap.width;
|
||
this._dispSprite.scale.y = Graphics.height / this._dispBitmap.height;
|
||
this._dispFilter = new PIXI.filters.DisplacementFilter(this._dispSprite);
|
||
}
|
||
|
||
this._waveSprite.bitmap = this._waveBitmap;
|
||
this._waveSprite.filters = [this._dispFilter];
|
||
};
|
||
|
||
KMS_WaterEffect.prototype.update = function()
|
||
{
|
||
if (PixiVersion == 2)
|
||
{
|
||
this._dispFilter.offset.x += this._speed.x;
|
||
this._dispFilter.offset.y += this._speed.y;
|
||
}
|
||
else
|
||
{
|
||
// For Pixi v4
|
||
this._dispSprite.x += this._speed.x;
|
||
this._dispSprite.y += this._speed.y;
|
||
}
|
||
this._waveSprite.origin.x += this._speed.x / 2.0;
|
||
this._waveSprite.origin.y += this._speed.y / 2.0;
|
||
};
|
||
|
||
Object.defineProperty(KMS_WaterEffect.prototype, 'filters', {
|
||
get: function()
|
||
{
|
||
return Param.autoTone ?
|
||
[this._dispFilter, this._colorFilter] :
|
||
[this._dispFilter];
|
||
}
|
||
});
|
||
|
||
Object.defineProperty(KMS_WaterEffect.prototype, 'dispSprite', {
|
||
get: function()
|
||
{
|
||
return this._dispSprite;
|
||
}
|
||
});
|
||
|
||
Object.defineProperty(KMS_WaterEffect.prototype, 'waveSprite', {
|
||
get: function()
|
||
{
|
||
return this._waveSprite;
|
||
}
|
||
});
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Spriteset_Base
|
||
|
||
/*
|
||
* 水中エフェクトの作成。
|
||
* 水中マップでなければ何もしない。
|
||
*/
|
||
Spriteset_Base.prototype.createWaterMapEffect = function()
|
||
{
|
||
if (!Graphics.isWebGL())
|
||
{
|
||
//console.warn("WebGL で動作していないため、エフェクトをスキップします。");
|
||
return;
|
||
}
|
||
|
||
if ($dataMap && $dataMap.meta.WaterEffect)
|
||
{
|
||
this._waterEffect = new KMS_WaterEffect();
|
||
this._waterEffect.loadImage();
|
||
}
|
||
};
|
||
|
||
/*
|
||
* ロード完了後のエフェクト適用処理本体
|
||
*/
|
||
Spriteset_Base.prototype.applyWaterMapEffectBody = function(target, waveContainer)
|
||
{
|
||
if (!this._waterEffect)
|
||
{
|
||
return;
|
||
}
|
||
|
||
this._waterEffect.createEffect();
|
||
|
||
if (target instanceof Array)
|
||
{
|
||
for (var i = 0; i < target.length; ++i) {
|
||
target[i].filters = this._waterEffect.filters;
|
||
|
||
// フィルタの適用範囲 (指定しないとキャプチャできなくなる)
|
||
var margin = 48;
|
||
var width = Graphics.width + margin;
|
||
var height = Graphics.height + margin;
|
||
target[i].filterArea = new Rectangle(-margin, -margin, width, height);
|
||
}
|
||
}
|
||
|
||
if (waveContainer)
|
||
{
|
||
if (PixiVersion == 4)
|
||
{
|
||
waveContainer.addChild(this._waterEffect.dispSprite);
|
||
}
|
||
waveContainer.addChild(this._waterEffect.waveSprite);
|
||
}
|
||
};
|
||
|
||
Spriteset_Base.prototype.updateWaterMapEffect = function()
|
||
{
|
||
if (this._waterEffect)
|
||
{
|
||
this._waterEffect.update();
|
||
}
|
||
};
|
||
|
||
var _KMS_WaterMapEffect_Spriteset_Base_update = Spriteset_Base.prototype.update;
|
||
Spriteset_Base.prototype.update = function()
|
||
{
|
||
_KMS_WaterMapEffect_Spriteset_Base_update.call(this);
|
||
this.updateWaterMapEffect();
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Spriteset_Map
|
||
|
||
var _KMS_WaterMapEffect_Spriteset_Map_initialize =
|
||
Spriteset_Map.prototype.initialize;
|
||
Spriteset_Map.prototype.initialize = function()
|
||
{
|
||
_KMS_WaterMapEffect_Spriteset_Map_initialize.call(this);
|
||
this.createWaterMapEffect();
|
||
};
|
||
|
||
/*
|
||
* ロード完了後に呼ばれるエフェクト適用処理
|
||
*/
|
||
Spriteset_Map.prototype.applyWaterMapEffect = function()
|
||
{
|
||
this.applyWaterMapEffectBody([this], this._baseSprite);
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Spriteset_Battle
|
||
|
||
var _KMS_WaterMapEffect_Spriteset_Battle_initialize =
|
||
Spriteset_Battle.prototype.initialize;
|
||
Spriteset_Battle.prototype.initialize = function()
|
||
{
|
||
_KMS_WaterMapEffect_Spriteset_Battle_initialize.call(this);
|
||
this.createWaterMapEffect();
|
||
};
|
||
|
||
/*
|
||
* ロード完了後に呼ばれるエフェクト適用処理
|
||
*/
|
||
Spriteset_Battle.prototype.applyWaterMapEffect = function()
|
||
{
|
||
this.applyWaterMapEffectBody(
|
||
[this._backgroundSprite, this._back1Sprite, this._back2Sprite],
|
||
this._battleField);
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Scene_Map
|
||
|
||
var _KMS_WaterMapEffect_Scene_Map_start =
|
||
Scene_Map.prototype.start;
|
||
Scene_Map.prototype.start = function()
|
||
{
|
||
_KMS_WaterMapEffect_Scene_Map_start.call(this);
|
||
this._spriteset.applyWaterMapEffect();
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Scene_Battle
|
||
|
||
var _KMS_WaterMapEffect_Scene_Battle_start =
|
||
Scene_Battle.prototype.start;
|
||
Scene_Battle.prototype.start = function()
|
||
{
|
||
_KMS_WaterMapEffect_Scene_Battle_start.call(this);
|
||
this._spriteset.applyWaterMapEffect();
|
||
};
|
||
|
||
})();
|