//============================================================================= // Foreground.js (Ver1.1) //============================================================================= // [History] // 2015.Nov. 7 1.0.0 First Release // 2018.Sep.19 1.0.1 Fix bug when 'event command -> test' becomes error // 2019.Dec.08 1.1.0 Update to run under also MZ /*: * @target MV MZ * @plugindesc display foreground tiling sprite(Ver1.1) * @author Sasuke KANNAZUKI * * @noteParam fgName * @noteRequire 1 * @noteDir img/parallaxes/ * @noteType file * @noteData maps * * @help This plugin does not provide plugin commands. * This plugin runs under RPG Maker MV and MZ. * * [Summary] * 'foreground' is like a parallax that displays over the map. * put bitmap file at img/parallaxes. * * Map Note: * write down following 5 settings at map's note. * name is the string, file name of tiling sprite. * if the name starts '!', it is regarded as "foreground zero". * the filename is searched from img/parallaxes. * number is the flag of loop x. 0:no 1:yes * if this is not written on the note, it'll be 0(=no). * number is the flag of loop y. 0:no 1:yes * if this is not written on the note, it'll be 0(=no). * number is x scroll speed. * when it doesn't loop x, this is ignored. * if this is not written on the note, it'll be 0. * number is y scroll speed. * when it doesn't loop y, this is ignored. * if this is not written on the note, it'll be 0. * * Ex. * * * * * [License] * Special thanks to Yoji Ojima. * This plugin is released under MIT license. * http://opensource.org/licenses/mit-license.php */ /*:ja * @target MV MZ * @plugindesc マップに合わせてスクロールする近景の設定(Ver1.1) * @author 神無月サスケ * * @noteParam fgName * @noteRequire 1 * @noteDir img/parallaxes/ * @noteType file * @noteData maps * * @help このプラグインにプラグインコマンドはありません。 * このプラグインは、RPGツクールMVおよびMZに対応しています。 * * ■概要 * 近景(foreground)は、マップの上に表示される遠景のようなものです。 * 使用する画像ファイルは、img/parallaxes に置いてください。 * * マップのメモ: * 以下の5項目を書いてください(設定項目は、遠景と似ています)。 * 前景として使うファイル名です(拡張子なし) * 名前が '!'で始まる場合、遠景同様視差ゼロとなります。 * ファイルは img/parallaxes に置いてください * X座標にループするかどうか (0:no 1:yes)。 * 省略時は0(=no)になります。 * Y座標にループするかどうか (0:no 1:yes)。 * 省略時は0(=no)になります。 * X座標のスクロール速度です * X座標にループしない場合は無視されます。 * 省略時は0になります。 * Y座標のスクロール速度です * Y座標にループしない場合は無視されます。 * 省略時は0になります。 * * 例: * * sample1.png が前景になり、斜め上にループします。 * * * 視差ゼロで!sample1.png が表示されます。 * * ■ライセンス表記 * プラグイン作成にあたりご指導くださったYoji Ojima様に感謝します。 * このプラグインは MIT ライセンスで配布されます。 * ご自由にお使いください。 * http://opensource.org/licenses/mit-license.php */ (function() { // // check zero foreground or not. // ImageManager.isZeroForeground = function(filename) { return filename.charAt(0) === '!'; }; // // map initialization // var _Game_Map_initialize = Game_Map.prototype.initialize; Game_Map.prototype.initialize = function() { _Game_Map_initialize.call(this); this.initForeground(); }; Game_Map.prototype.initForeground = function(){ this._foregroundDefined = true; this._foregroundName = ''; this._foregroundZero = false; this._foregroundLoopX = false; this._foregroundLoopY = false; this._foregroundSx = 0; this._foregroundSy = 0; this._foregroundX = 0; this._foregroundY = 0; }; // // if foreground is undefined, initialize it. // Game_Map.prototype.guardForeground = function(){ if(!this._foregroundDefined){ this.initForeground(); } }; // // an accessor // Game_Map.prototype.foregroundName = function() { this.guardForeground(); return this._foregroundName; }; // // set foreground by reading map's note. // var _Game_Map_setup = Game_Map.prototype.setup; Game_Map.prototype.setup = function(mapId) { _Game_Map_setup.call(this, mapId); this.setupForeground(); }; Game_Map.prototype.setupForeground = function() { if ($dataMap.meta) { this._foregroundName = $dataMap.meta.fgName || ''; this._foregroundZero = ImageManager.isZeroForeground( this._foregroundName); this._foregroundLoopX = !!$dataMap.meta.fgLoopX; this._foregroundLoopY = !!$dataMap.meta.fgLoopY; this._foregroundSx = Number($dataMap.meta.fgSx) || 0; this._foregroundSy = Number($dataMap.meta.fgSy) || 0; } this._foregroundX = 0; this._foregroundY = 0; }; // // to display foreground // var _Game_Map_setDisplayPos = Game_Map.prototype.setDisplayPos; Game_Map.prototype.setDisplayPos = function(x, y) { _Game_Map_setDisplayPos.call(this, x, y); this.guardForeground(); if (this.isLoopHorizontal()) { this._foregroundX = x; } else { this._foregroundX = this._displayX; } if (this.isLoopVertical()) { this._foregroundY = y; } else { this._foregroundY = this._displayY; } }; Game_Map.prototype.foregroundOx = function() { this.guardForeground(); if (this._foregroundZero) { return this._foregroundX * this.tileWidth(); } else if (this._foregroundLoopX) { return this._foregroundX * this.tileWidth() / 2; } else { return 0; } }; Game_Map.prototype.foregroundOy = function() { this.guardForeground(); if (this._foregroundZero) { return this._foregroundY * this.tileHeight(); } else if (this._foregroundLoopY) { return this._foregroundY * this.tileHeight() / 2; } else { return 0; } }; // // to scroll foreground // var _Game_Map_scrollDown = Game_Map.prototype.scrollDown; Game_Map.prototype.scrollDown = function(distance) { var lastY = this._displayY; _Game_Map_scrollDown.call(this, distance); this.guardForeground(); if (this.isLoopVertical()) { if (this._foregroundLoopY) { this._foregroundY += distance; } } else if (this.height() >= this.screenTileY()) { var displayY = Math.min(lastY + distance, this.height() - this.screenTileY()); this._foregroundY += displayY - lastY; } }; var _Game_Map_scrollLeft = Game_Map.prototype.scrollLeft; Game_Map.prototype.scrollLeft = function(distance) { var lastX = this._displayX; _Game_Map_scrollLeft.call(this, distance); this.guardForeground(); if (this.isLoopHorizontal()) { if (this._foregroundLoopX) { this._foregroundX -= distance; } } else if (this.width() >= this.screenTileX()) { var displayX = Math.max(lastX - distance, 0); this._foregroundX += displayX - lastX; } }; var _Game_Map_scrollRight = Game_Map.prototype.scrollRight; Game_Map.prototype.scrollRight = function(distance) { var lastX = this._displayX; _Game_Map_scrollRight.call(this, distance); this.guardForeground(); if (this.isLoopHorizontal()) { if (this._foregroundLoopX) { this._foregroundX += distance; } } else if (this.width() >= this.screenTileX()) { var displayX = Math.min(lastX + distance, this.width() - this.screenTileX()); this._foregroundX += displayX - lastX; } }; var _Game_Map_scrollUp = Game_Map.prototype.scrollUp; Game_Map.prototype.scrollUp = function(distance) { var lastY = this._displayY; _Game_Map_scrollUp.call(this, distance); this.guardForeground(); if (this.isLoopVertical()) { if (this._foregroundLoopY) { this._foregroundY -= distance; } } else if (this.height() >= this.screenTileY()) { var displayY = Math.max(lastY - distance, 0); this._foregroundY += displayY - lastY; } }; // // update foreground // var _Game_Map_update = Game_Map.prototype.update; Game_Map.prototype.update = function(sceneActive) { _Game_Map_update.call(this, sceneActive); this.updateForeground(); }; Game_Map.prototype.updateForeground = function() { this.guardForeground(); if (this._foregroundLoopX) { this._foregroundX += this._foregroundSx / this.tileWidth() / 2; } if (this._foregroundLoopY) { this._foregroundY += this._foregroundSy / this.tileHeight() / 2; } }; // // sprites // var _Spriteset_Map_createLowerLayer = Spriteset_Map.prototype.createLowerLayer; Spriteset_Map.prototype.createLowerLayer = function() { _Spriteset_Map_createLowerLayer.call(this); this.createForeground(); }; var _Spriteset_Map_update = Spriteset_Map.prototype.update; Spriteset_Map.prototype.update = function() { _Spriteset_Map_update.call(this); this.updateForeground(); }; Spriteset_Map.prototype.createForeground = function() { this._foreground = new TilingSprite(); this._foreground.move(0, 0, Graphics.width, Graphics.height); // in order to display under the weather sprites: this._baseSprite.removeChild(this._weather); this._baseSprite.addChild(this._foreground); this._baseSprite.addChild(this._weather); }; Spriteset_Map.prototype.updateForeground = function() { if (this._foregroundName !== $gameMap.foregroundName()) { this._foregroundName = $gameMap.foregroundName(); this._foreground.bitmap = ImageManager.loadParallax(this._foregroundName); } if (this._foreground.bitmap) { this._foreground.origin.x = $gameMap.foregroundOx(); this._foreground.origin.y = $gameMap.foregroundOy(); } }; })();