191 lines
6.1 KiB
JavaScript
191 lines
6.1 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;
|
||
}
|
||
};
|
||
})();
|