Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //=============================================================================
- // μ'ki's Advanced Parallax v1.00
- // MK_AdvParallax.js
- //=============================================================================
- var Imported = Imported || {};
- var Maki = Maki || {};
- //=============================================================================
- /*:
- * @plugindesc v1.00 Advanced Parallax
- * @author μ'ki
- *
- * @help
- * ============================================================================
- * Introduction
- * ============================================================================
- *
- * This plugin allows you to have more control on map parallaxes by defining
- * them in the map notetag. It also allows you to define multiple layered
- * parallaxes (either behind or in front of the tiles and characters), a bit
- * like in RPG Maker XP games, which have panoramas and fogs. Additionally,
- * you can make animated parallaxes (having more than one frame).
- *
- * Contact me for support/bug report:
- * listra92[at]gmail[dot]com
- *
- * ============================================================================
- * Map Notetag
- * ============================================================================
- *
- * <parallax>
- * property: value
- * ...
- * </parallax>
- * Defines a parallax with properties as follows (optionally present, have
- * their default value):
- * - name: parallax image name (in \img\parallaxes folder)
- * - loopx: whether to loop the parallax horizontally and let it scroll
- * - loopy: whether to loop the parallax vertically and let it scroll
- * - sx: the parallax horizontal scroll speed (a script to eval)
- * - sy: the parallax vertical scroll speed (a script to eval)
- * - x: the parallax initial x-position
- * - y: the parallax initial y-position
- * - alpha: the parallax opacity (0~255, a script to eval)
- * - depth: the parallax image depth (1: behind the map tiles,
- * 2: just behind the map weather, a 'fog',
- * 3: in front of the map weather, a 'fog')
- * - frames: number of the image animation frames
- * - framesp: the image animation speed (frames per sec., a script to eval)
- * Note that you can define multiple tags for multiple parallaxes.
- *
- * Example:
- * <parallax>
- * name: StarlitSky
- * loopx: true
- * loopy: true
- * sx: 4
- * sy: $gameVariables.value(1)
- * depth: 1
- * frames: 4
- * framesp: 2
- * </parallax>
- *
- * ============================================================================
- * Animated Parallaxes
- * ============================================================================
- *
- * You can make parallaxes animated with more than one frame. For such that,
- * put several files in \img\parallaxes folder, for example StarlitSky_1.png,
- * StarlitSky_2.png, ... for each frame of the parallax StarlitSky defined in
- * the map note. For non-animated ones, just put the file as usual, i.e.
- * StarlitSky.png.
- *
- * ============================================================================
- * Functions
- * ============================================================================
- *
- * $gameMap.changeParallax(name, loopX, loopY, sx, sy[, idx, opacity, framesp]);
- *
- * Changes parallax properties with designated index idx (by order of the tag
- * definition in the map note). Here sx, sy, opacity, framesp can be either
- * number or eval string.
- *
- * ============================================================================
- * Known Issues
- * ============================================================================
- *
- * - Somewhat huge memory usage, especially in dealing with animated parallaxes.
- *
- */
- //=============================================================================
- //=============================================================================
- // Parameter Variables
- //=============================================================================
- Maki.Parameters = PluginManager.parameters('MK_AdvParallax');
- Maki.Params = Maki.Params || {};
- Maki.Aliases = Maki.Aliases || {};
- //-----------------------------------------------------------------------------
- // Game_Map
- //
- // The game object class for a map. It contains scrolling and passage
- // determination functions.
- Maki.Aliases.GameMapInitialize = Game_Map.prototype.initialize;
- Game_Map.prototype.initialize = function() {
- Maki.Aliases.GameMapInitialize.call(this);
- this._sparallaxName = [];
- this._sparallaxZero = [];
- this._sparallaxLoopX = [];
- this._sparallaxLoopY = [];
- this._sparallaxSx = [];
- this._sparallaxSy = [];
- this._sparallaxSxf = [];
- this._sparallaxSyf = [];
- this._sparallaxX = [];
- this._sparallaxY = [];
- this._sparallaxOpacity = [];
- this._sparallaxOpacityf = [];
- this._sparallaxDepth = [];
- this._sparallaxFrame = [];
- this._sparallaxFrames = [];
- this._sparallaxFrameSp = [];
- this._sparallaxFrameSpf = [];
- this._sparallaxFrameDel = [];
- this._sparallaxNeedRef = [];
- };
- Game_Map.prototype.parallaxName = function(idx) {
- idx = idx || 0;
- return this._sparallaxName[idx];
- };
- Maki.Aliases.GameMapSetupParallax = Game_Map.prototype.setupParallax;
- Game_Map.prototype.setupParallax = function() {
- Maki.Aliases.GameMapSetupParallax.call(this);
- delete this._sparallaxName;
- delete this._sparallaxZero;
- delete this._sparallaxLoopX;
- delete this._sparallaxLoopY;
- delete this._sparallaxSx;
- delete this._sparallaxSy;
- delete this._sparallaxSxf;
- delete this._sparallaxSyf;
- delete this._sparallaxX;
- delete this._sparallaxY;
- delete this._sparallaxOpacity;
- delete this._sparallaxOpacityf;
- delete this._sparallaxDepth;
- delete this._sparallaxFrame;
- delete this._sparallaxFrames;
- delete this._sparallaxFrameSp;
- delete this._sparallaxFrameSpf;
- delete this._sparallaxFrameDel;
- delete this._sparallaxNeedRef;
- this._sparallaxName = [];
- this._sparallaxZero = [];
- this._sparallaxLoopX = [];
- this._sparallaxLoopY = [];
- this._sparallaxSx = [];
- this._sparallaxSy = [];
- this._sparallaxSxf = [];
- this._sparallaxSyf = [];
- this._sparallaxX = [];
- this._sparallaxY = [];
- this._sparallaxOpacity = [];
- this._sparallaxOpacityf = [];
- this._sparallaxDepth = [];
- this._sparallaxFrame = [];
- this._sparallaxFrames = [];
- this._sparallaxFrameSp = [];
- this._sparallaxFrameSpf = [];
- this._sparallaxFrameDel = [];
- this._sparallaxNeedRef = [];
- this.parseData();
- };
- Game_Map.prototype.parseData = function() {
- var note1 = /<(?:parallax)>/i;
- var note2 = /<\/(?:parallax)>/i;
- var notedata = $dataMap.note.split(/[\r\n]+/);
- var parallaxPatternFlag = false;
- $dataMap.parallaxPattern = [];
- var l = notedata.length;
- for (var i = 0; i < l; i++){
- if (notedata[i].match(note1)) {
- parallaxPatternFlag = true;
- } else if (notedata[i].match(note2)) {
- parallaxPatternFlag = false;
- this._sparallaxName.push('');
- this._sparallaxZero.push(ImageManager.isZeroParallax(
- this._sparallaxName[this._sparallaxName.length-1]));
- this._sparallaxLoopX.push(false);
- this._sparallaxLoopY.push(false);
- this._sparallaxSx.push(0);
- this._sparallaxSy.push(0);
- this._sparallaxSxf.push('0');
- this._sparallaxSyf.push('0');
- this._sparallaxX.push(0);
- this._sparallaxY.push(0);
- this._sparallaxOpacity.push(255);
- this._sparallaxOpacityf.push('255');
- this._sparallaxDepth.push(1);
- this._sparallaxFrame.push(0);
- this._sparallaxFrames.push(1);
- this._sparallaxFrameSp.push(1);
- this._sparallaxFrameSpf.push('1');
- this._sparallaxFrameDel.push(-1);
- this._sparallaxNeedRef.push(true);
- var ll = $dataMap.parallaxPattern.length;
- for (var j = 0; j < ll; j++) {
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:name):[ ](.*)/i)) {
- this._sparallaxName[this._sparallaxName.length-1] = String(RegExp.$1);
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:loopx):[ ](.*)/i)) {
- this._sparallaxLoopX[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:loopy):[ ](.*)/i)) {
- this._sparallaxLoopY[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:sx):[ ](.*)/i)) {
- this._sparallaxSxf[this._sparallaxName.length-1] = String(RegExp.$1);
- this._sparallaxSx[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:sy):[ ](.*)/i)) {
- this._sparallaxSyf[this._sparallaxName.length-1] = String(RegExp.$1);
- this._sparallaxSy[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:x):[ ](.*)/i)) {
- this._sparallaxX[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:y):[ ](.*)/i)) {
- this._sparallaxY[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:alpha):[ ](.*)/i)) {
- this._sparallaxOpacityf[this._sparallaxName.length-1] = String(RegExp.$1);
- this._sparallaxOpacity[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:depth):[ ](.*)/i)) {
- this._sparallaxDepth[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:frames):[ ](.*)/i)) {
- this._sparallaxFrames[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- } else
- if ($dataMap.parallaxPattern[j].match(/[ ]*(?:framesp):[ ](.*)/i)) {
- this._sparallaxFrameSpf[this._sparallaxName.length-1] = String(RegExp.$1);
- this._sparallaxFrameSp[this._sparallaxName.length-1] = eval(String(RegExp.$1));
- this._sparallaxFrameDel[this._sparallaxName.length-1] =
- Math.floor(60/this._sparallaxFrameSp[this._sparallaxName.length-1]);
- }
- }
- $dataMap.parallaxPattern = [];
- } else if (parallaxPatternFlag) {
- $dataMap.parallaxPattern.push(notedata[i]);
- }
- }
- };
- Maki.Aliases.GameMapSetDisplayPos = Game_Map.prototype.setDisplayPos;
- Game_Map.prototype.setDisplayPos = function(x, y) {
- Maki.Aliases.GameMapSetDisplayPos.call(this, x, y);
- if (this.isLoopHorizontal()) {
- for(var i = 0; i < this._sparallaxName.length; i++){
- this._sparallaxX[i] = x;
- };
- } else {
- for(var i = 0; i < this._sparallaxName.length; i++){
- this._sparallaxX[i] = this._displayX;
- };
- }
- if (this.isLoopVertical()) {
- for(var i = 0; i < this._sparallaxName.length; i++){
- this._sparallaxY[i] = y;
- };
- } else {
- for(var i = 0; i < this._sparallaxName.length; i++){
- this._sparallaxY[i] = this._displayY;
- };
- }
- };
- Maki.Aliases.GameMapScrollDown = Game_Map.prototype.scrollDown;
- Game_Map.prototype.scrollDown = function(distance) {
- Maki.Aliases.GameMapScrollDown.call(this, distance);
- if (this.isLoopVertical()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- if (this._sparallaxLoopY[i]) this._sparallaxY[i] += distance;
- };
- } else if (this.height() >= this.screenTileY()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- this._sparallaxY[i] += 0;
- };
- }
- };
- Maki.Aliases.GameMapScrollLeft = Game_Map.prototype.scrollLeft;
- Game_Map.prototype.scrollLeft = function(distance) {
- Maki.Aliases.GameMapScrollLeft.call(this, distance);
- if (this.isLoopHorizontal()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- if (this._sparallaxLoopX[i]) this._sparallaxX[i] -= distance;
- };
- } else if (this.width() >= this.screenTileX()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- this._sparallaxX[i] += 0;
- };
- }
- };
- Maki.Aliases.GameMapScrollRight = Game_Map.prototype.scrollRight;
- Game_Map.prototype.scrollRight = function(distance) {
- Maki.Aliases.GameMapScrollRight.call(this, distance);
- if (this.isLoopHorizontal()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- if (this._sparallaxLoopX[i]) this._sparallaxX[i] += distance;
- };
- } else if (this.width() >= this.screenTileX()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- this._sparallaxX[i] += 0;
- };
- }
- };
- Maki.Aliases.GameMapScrollUp = Game_Map.prototype.scrollUp;
- Game_Map.prototype.scrollUp = function(distance) {
- Maki.Aliases.GameMapScrollUp.call(this, distance);
- if (this.isLoopVertical()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- if (this._sparallaxLoopY[i]) this._sparallaxY[i] -= distance;
- };
- } else if (this.height() >= this.screenTileY()) {
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- this._sparallaxY[i] += 0;
- };
- }
- };
- Maki.Aliases.GameMapUpdateParallax = Game_Map.prototype.updateParallax;
- Game_Map.prototype.updateParallax = function() {
- Maki.Aliases.GameMapUpdateParallax.call(this);
- var l = this._sparallaxName.length;
- for (var i = 0; i < l; i++){
- if (this._sparallaxLoopX[i]){
- this._sparallaxSx[i] = eval(this._sparallaxSxf[i]);
- this._sparallaxX[i] += this._sparallaxSx[i] / this.tileWidth() / 2;
- }
- if (this._sparallaxLoopY[i]){
- this._sparallaxSy[i] = eval(this._sparallaxSyf[i]);
- this._sparallaxY[i] += this._sparallaxSy[i] / this.tileHeight() / 2;
- }
- this._sparallaxOpacity[i] = eval(this._sparallaxOpacityf[i]);
- if (1 < this._sparallaxFrames[i]){
- this._sparallaxFrameSp[i] = eval(this._sparallaxFrameSpf[i]);
- this._sparallaxFrameDel[i] -= 1;
- if (this._sparallaxFrameDel[i] === 0) {
- this._sparallaxFrameDel[i] = Math.floor(60/this._sparallaxFrameSp[i]);
- this._sparallaxFrame[i] = (this._sparallaxFrame[i]+1) %
- this._sparallaxFrames[i];
- this._sparallaxNeedRef[i] = true;
- }
- }
- };
- };
- Game_Map.prototype.parallaxOx = function(idx) {
- idx = idx || 0;
- if (this._sparallaxZero[idx]) {
- return this._sparallaxX[idx] * this.tileWidth();
- } else if (this._sparallaxLoopX[idx]) {
- return this._sparallaxX[idx] * this.tileWidth() / 2;
- } else {
- return 0;
- }
- };
- Game_Map.prototype.parallaxOy = function(idx) {
- idx = idx || 0;
- if (this._sparallaxZero[idx]) {
- return this._sparallaxY[idx] * this.tileHeight();
- } else if (this._sparallaxLoopY[idx]) {
- return this._sparallaxY[idx] * this.tileHeight() / 2;
- } else {
- return 0;
- }
- };
- Maki.Aliases.GameMapChangeParallax = Game_Map.prototype.changeParallax;
- Game_Map.prototype.changeParallax = function(name, loopX, loopY, sx, sy,
- idx, opacity, framesp) {
- Maki.Aliases.GameMapChangeParallax.call(this, name, loopX, loopY, sx, sy);
- idx = idx || 0;
- opacity = opacity || 255;
- framesp = framesp || 1;
- this._sparallaxName[idx] = name;
- this._sparallaxZero[idx] = ImageManager.isZeroParallax(this._sparallaxName[idx]);
- if (this._sparallaxLoopX[idx] && !loopX) {
- this._sparallaxX[idx] = 0;
- }
- if (this._sparallaxLoopY[idx] && !loopY) {
- this._sparallaxY[idx] = 0;
- }
- this._sparallaxLoopX[idx] = loopX;
- this._sparallaxLoopY[idx] = loopY;
- this._sparallaxSxf[idx] = String(sx);
- this._sparallaxSyf[idx] = String(sy);
- this._sparallaxSx[idx] = eval(this._sparallaxSxf[idx]);
- this._sparallaxSy[idx] = eval(this._sparallaxSyf[idx]);
- this._sparallaxOpacityf[i] = String(opacity);
- this._sparallaxOpacity[i] = eval(this._sparallaxOpacityf[idx]);
- };
- Spriteset_Map.prototype.createLowerLayer = function() {
- Spriteset_Base.prototype.createLowerLayer.call(this);
- this._sparallaxName = [];
- this._sparallaxIdx = [];
- this._sparallaxx = [];
- this._parallax = new TilingSprite();
- this.createParallax(1);
- this.createTilemap();
- this.createCharacters();
- this.createShadow();
- this.createDestination();
- this.createParallax(2);
- this.createWeather();
- this.createParallax(3);
- };
- Spriteset_Map.prototype.createParallax = function(depth) {
- depth = depth || 1;
- var l = $gameMap._sparallaxName.length;
- for(var i = 0; i < l; i++){
- if ($gameMap._sparallaxDepth[i] === depth) {
- this._sparallaxName.push('');
- this._sparallaxIdx.push(i);
- this._sparallaxx.push([]);
- var f = this._sparallaxx.length-1;
- for(var j = 0; j < $gameMap._sparallaxFrames[i]; j++){
- this._sparallaxx[f].push(new TilingSprite());
- this._sparallaxx[f][j].move(
- 0, 0, Graphics.width, Graphics.height);
- this._baseSprite.addChild(this._sparallaxx[f][j]);
- };
- }
- };
- };
- Spriteset_Map.prototype.updateParallax = function() {
- var l = this._sparallaxName.length;
- for(var i = 0; i < l; i++){
- if (this._sparallaxName[i] !== $gameMap.parallaxName(this._sparallaxIdx[i])) {
- this._sparallaxName[i] = $gameMap.parallaxName(this._sparallaxIdx[i]);
- if (1 < $gameMap._sparallaxFrames[i]){
- for(var j = 0; j < $gameMap._sparallaxFrames[i]; j++){
- this._sparallaxx[i][j].bitmap = ImageManager.loadParallax(
- $gameMap._sparallaxName[this._sparallaxIdx[i]]+'_'+j);
- };
- }
- if ($gameMap._sparallaxFrames[i] === 1)
- this._sparallaxx[i][0].bitmap = ImageManager.loadParallax(
- $gameMap._sparallaxName[this._sparallaxIdx[i]]);
- }
- var f = $gameMap._sparallaxFrame[i];
- if (this._sparallaxx[i][f].bitmap) {
- if (1 < $gameMap._sparallaxFrames[i] &&
- $gameMap._sparallaxNeedRef[this._sparallaxIdx[i]]){
- for(var j = 0; j < $gameMap._sparallaxFrames[i]; j++){
- this._sparallaxx[i][j].visible = (f === j);
- };
- $gameMap._sparallaxNeedRef[this._sparallaxIdx[i]] = false;
- }
- this._sparallaxx[i][f].origin.x = $gameMap.parallaxOx(this._sparallaxIdx[i]);
- this._sparallaxx[i][f].origin.y = $gameMap.parallaxOy(this._sparallaxIdx[i]);
- this._sparallaxx[i][f].opacity =
- $gameMap._sparallaxOpacity[this._sparallaxIdx[i]];
- }
- };
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement