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