Files
Superproject1/js/plugins/PictureWipe.js
T
2023-04-11 22:11:31 +02:00

194 lines
6.6 KiB
JavaScript

//=============================================================================
// PictureWipe.js
//=============================================================================
/*:
* @plugindesc Transition effects for event pictures.
* @author Yoji Ojima
*
* @help
*
* Plugin Command:
* PictureWipe 1 down in 60
*
* The above plugin command means that the "down" transition effect will be
* applied for displaying the picture #1, in 60 frames.
*
* The first argument specifies the picture ID.
*
* The second argument specifies the type of the effect.
* Can be selected from the following types:
* down - From the top to the bottom.
* up - From the bottom to the top.
* right - From the left to the right.
* left - From the right to the left.
* square - From the center to the edge with a square shape.
* circle - From the center to the edge with a circle shape.
* hblind - Horizontal blind effect.
* vblind - Vertical blind effect.
* grid - Grid effect.
*
* The third argument should be "in" to display or "out" to erase.
*
* The fourth argument specifies the transition time in frames.
*/
/*:ja
* @plugindesc ピクチャの切り替えエフェクトです。
* @author Yoji Ojima
*
* @help
*
* プラグインコマンド:
* PictureWipe 1 down in 60
*
* 上記のプラグインコマンドは、ピクチャ1番を表示する際に「down」の切り替え
* エフェクトを60フレーム表示することを指定しています。
*
* 1つ目の引数には、ピクチャIDを指定します。
*
* 2つ目の引数には、エフェクトの種類を指定します。
* 以下の種類が選択可能です:
* down - 上から下へ。
* up - 下から上へ。
* right - 左から右へ。
* left - 右から左へ。
* square - 正方形で中央から端へ。
* circle - 円形で中央から端へ。
* hblind - 水平ブラインド効果。
* vblind - 垂直ブラインド効果。
* grid - グリッド効果。
*
* 3つ目の引数は、表示なら「in」、消去なら「out」とします。
*
* 4つめの引数は、トランジション時間をフレーム数で指定します。
*/
(function() {
var _Game_Interpreter_pluginCommand =
Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
if (command === 'PictureWipe') {
var pictureId = Number(args[0]);
var wipeType = String(args[1]) || 'down';
var wipeDirection = String(args[2]) || 'in';
var wipeMaxFrames = Number(args[3]) || 60;
var picture = $gameScreen.picture(pictureId);
if (picture) {
picture.wipeType = wipeType;
picture.wipeDirection = wipeDirection;
picture.wipeMaxFrames = wipeMaxFrames;
picture.wipeIndex = 0;
}
}
};
var _Game_Picture_update = Game_Picture.prototype.update;
Game_Picture.prototype.update = function() {
_Game_Picture_update.call(this);
this.updateWipe();
};
Game_Picture.prototype.updateWipe = function() {
if (this.wipeIndex < this.wipeMaxFrames) {
this.wipeIndex++;
}
};
var _Sprite_Picture_update = Sprite_Picture.prototype.update;
Sprite_Picture.prototype.update = function() {
_Sprite_Picture_update.call(this);
if (this.picture() && this.visible) {
this.updateWipe();
}
};
Sprite_Picture.prototype.updateWipe = function() {
var picture = this.picture();
if (picture.wipeIndex < picture.wipeMaxFrames) {
var source = ImageManager.loadPicture(this._pictureName);
if (source.isReady()) {
if (!this.bitmap || this.bitmap === source) {
this.bitmap = new Bitmap(source.width, source.height);
}
var density = 0;
if (picture.wipeDirection === 'in') {
density = picture.wipeIndex / picture.wipeMaxFrames;
} else if (picture.wipeDirection === 'out') {
density = 1 - picture.wipeIndex / picture.wipeMaxFrames;
}
this.bitmap.clear();
this.paintWipe(this.bitmap, picture.wipeType, density);
var context = this.bitmap.context;
context.save();
context.globalCompositeOperation = 'source-in';
context.drawImage(source.canvas, 0, 0);
context.restore();
}
} else if (picture.wipeDirection === 'in') {
this.bitmap = ImageManager.loadPicture(this._pictureName);
} else if (picture.wipeDirection === 'out') {
this.bitmap.clear();
}
};
Sprite_Picture.prototype.paintWipe = function(bitmap, type, density) {
var blindSize = 48;
var w = bitmap.width;
var h = bitmap.height;
var cx = w / 2;
var cy = h / 2;
var color = 'white';
var size, i, j;
switch (type) {
case 'down':
size = h * density;
bitmap.fillRect(0, 0, w, size, color);
break;
case 'up':
size = h * density;
bitmap.fillRect(0, h - size, w, size, color);
break;
case 'right':
size = w * density;
bitmap.fillRect(0, 0, size, h, color);
break;
case 'left':
size = w * density;
bitmap.fillRect(w - size, 0, size, h, color);
break;
case 'square':
size = Math.max(w, h) / 2 * density;
bitmap.fillRect(cx - size, cy - size, size * 2, size * 2, color);
break;
case 'circle':
size = Math.sqrt(w * w + h * h) / 2 * density;
bitmap.drawCircle(cx, cy, size, color);
break;
case 'hblind':
size = blindSize * density;
for (i = 0; i < h; i += blindSize) {
bitmap.fillRect(0, i, w, size, color);
}
break;
case 'vblind':
size = blindSize * density;
for (i = 0; i < w; i += blindSize) {
bitmap.fillRect(i, 0, size, h, color);
}
break;
case 'grid':
size = blindSize * density;
for (i = 0; i < h; i += blindSize) {
for (j = 0; j < w; j += blindSize) {
bitmap.fillRect(j, i, size, size, color);
}
}
break;
}
};
})();