Skip to content

Instantly share code, notes, and snippets.

@elleonard
Last active April 6, 2024 02:34
Show Gist options
  • Save elleonard/18d15fdc00e5c4cfdc2b714dac842a98 to your computer and use it in GitHub Desktop.
Save elleonard/18d15fdc00e5c4cfdc2b714dac842a98 to your computer and use it in GitHub Desktop.
RPGツクールMV ピクチャでピクチャをマスクするプラグインのサンプル
/*:ja
* @plugindesc ピクチャをマスクするプラグインコマンドサンプル
* @author DarkPlasma
* @license MIT
*
* @target MV
* @help
*
* MaskPicture 1 2
* ピクチャ1をピクチャ2でマスクします。
*
* UnmaskPicture 1
* ピクチャ1にかけたマスクを解除します。
*/
(() => {
'use strict';
function Game_Screen_MaskPictureMixIn(gameScreen) {
gameScreen.maskPicture = function (basePictureId, maskPictureId) {
const basePicture = this.picture(basePictureId);
const maskPicture = this.picture(maskPictureId);
if (!basePicture || !maskPicture) {
return;
}
this._maskPictureRequest = {
base: basePictureId,
mask: maskPictureId,
};
};
gameScreen.unmaskPicture = function (basePictureId) {
this._unmaskPictureRequest = basePictureId;
}
gameScreen.maskPictureRequest = function () {
return this._maskPictureRequest;
};
gameScreen.unmaskPictureRequest = function () {
return this._unmaskPictureRequest;
};
gameScreen.resetMaskPictureRequest = function () {
this._maskPictureRequest = undefined;
};
gameScreen.resetUnmaskPictureRequest = function () {
this._unmaskPictureRequest = undefined;
};
}
Game_Screen_MaskPictureMixIn(Game_Screen.prototype);
function Game_Interpreter_MaskPictureMixIn(gameInterpreter) {
const _pluginCommand = gameInterpreter.pluginCommand;
gameInterpreter.pluginCommand = function(command, args) {
if (command === "MaskPicture") {
const base = Number(args[0] || 1);
const mask = Number(args[1] || 2);
$gameScreen.maskPicture(base, mask);
} else if (command === "UnmaskPicture") {
const base = Number(args[0] || 1);
$gameScreen.unmaskPicture(base);
}
_pluginCommand.call(this, command, args);
};
}
Game_Interpreter_MaskPictureMixIn(Game_Interpreter.prototype);
function Spriteset_MaskPictureMixIn(spritesetClass) {
const _update = spritesetClass.update;
spritesetClass.update = function () {
_update.call(this);
this.updateMask();
};
spritesetClass.updateMask = function () {
if ($gameScreen.maskPictureRequest()) {
const baseSprite = this._pictureContainer.children
.find(sprite => sprite.pictureId() === $gameScreen.maskPictureRequest().base);
const maskSprite = this._pictureContainer.children
.find(sprite => sprite.pictureId() === $gameScreen.maskPictureRequest().mask);
if (baseSprite && maskSprite) {
baseSprite.setMask(maskSprite);
}
$gameScreen.resetMaskPictureRequest();
}
if ($gameScreen.unmaskPictureRequest()) {
const baseSprite = this._pictureContainer.children
.find(sprite => sprite.pictureId() === $gameScreen.unmaskPictureRequest());
if (baseSprite) {
baseSprite.unmask();
}
$gameScreen.resetUnmaskPictureRequest();
}
};
}
Spriteset_MaskPictureMixIn(Spriteset_Base.prototype);
function Sprite_Picture_MaskMixIn(spritePicture) {
spritePicture.setMask = function (sprite) {
this.mask = sprite;
};
spritePicture.unmask = function () {
this.mask = undefined;
};
spritePicture.pictureId = function () {
return this._pictureId;
};
}
Sprite_Picture_MaskMixIn(Sprite_Picture.prototype);
})();
@elleonard
Copy link
Author

こちらはサンプル実装であり、シーンチェンジによってマスクが解除される問題があります。
こちらでMZ版 MV版を紹介していますので、単にプラグインを利用したい場合はそちらをどうぞ。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment