# VisuStella PictureCommonEventでホバートーンの不具合

**URL:** <https://guild.rpgmakerofficial.com/t/topic/3480>\
**Category:** 質問\
**Created:** [2026 年 10 月 29 日午後 10:18 UTC](https://guild.rpgmakerofficial.com/t/topic/3480 "2026-10-29T22:18:59Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![KamiStone](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/kamistone/32/9055_2.png) [@KamiStone](https://guild.rpgmakerofficial.com/u/KamiStone)\
**Post date:** [2026 年 10 月 29 日午後 10:18 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/1 "2026-10-29T22:18:59Z")

</div>

皆さん、こんにちは！

VisuStella の PictureCommonEvent プラグインで困っていることがあります。  
画像の上にマウスカーソルを乗せると、色調が白に変わります（これは期待通りの動作です）。

 ![Capture d'écran 2026-10-29 231233](https://us1.discourse-cdn.com/flex002/uploads/rpgmaker_community/original/2X/a/a247707a9fab6910d8a10b363cce2a85b3997ef3.png)

 ![Capture d'écran 2026-10-29 231241](https://us1.discourse-cdn.com/flex002/uploads/rpgmaker_community/original/2X/6/67595151590333286c786061f6f4a2b9c77ddf24.png)

問題は、画像とイベントを削除する場合（「Clear Picture Common Event」を使用）、その瞬間にマウスカーソルが画像の上にあったら、色調変更が残ってしまうことです。つまり、画像を再表示すると、そのまま白く色がかった状態になってしまいます。  
この問題を解決する方法をご存知ですか？「Change Tone on Hover」の設定を無効にしても、この問題は発生するということもお伝えしておきます。

---

<div class="post-metadata">

**Author:** ![Baz](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/baz/32/100_2.png) [@Baz](https://guild.rpgmakerofficial.com/u/Baz)\
**Post date:** [2026 年 10 月 29 日午後 10:41 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/2 "2026-10-29T22:41:46Z")

</div>

プラグインって、マウスがピクチャから離れたときだけトーンを元に戻す仕組みになってるんじゃないかな？だとすると、カーソルがまだ乗った状態でクリアするとその処理がスキップされちゃうかも。

クリアする直前（またはもう一度表示する直後）に、同じピクチャIDに対してTint Pictureで0, 0, 0, 0、フレーム数0をかけるっていうのはどう？

あと、Change Tone on Hoverはどこでオフにした？プラグインのパラメータで切ったとしても、ピクチャがChange Picture Common Eventのプラグインコマンド経由でイベントを受け取ってるなら、そのコマンド側のCustom settingsが実際に使われてるんじゃないかな。

それでも解決しないようなら、プラグイン内部で起きてることっぽだから、VisuStellaに報告してみてもいいかも。

---

<div class="post-metadata">

**Author:** ![KamiStone](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/kamistone/32/9055_2.png) [@KamiStone](https://guild.rpgmakerofficial.com/u/KamiStone)\
**Post date:** [2026 年 10 月 30 日午前 5:34 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/3 "2026-10-30T05:34:17Z")

</div>

返信ありがとうございます！

Tint Pictureを試してみましたが、何も効果がありません。トーン変更（Tone Change）が、RPG MakerのTone Changeコードを無視しているプラグイン内部の処理なんじゃないかと思います。  
プラグイン内でChange Toneパラメータを変更できますが、先ほども言った通り効果はなく、ホバー状態が保存されたままになっていて、ピクチャを再表示するとTone Changeが元に戻ってしまいます。

 ![Capture d'écran 2026-10-30 063528](https://us1.discourse-cdn.com/flex002/uploads/rpgmaker_community/original/2X/e/eb18b7587ad64b64d1eb0754d9517b47c5542535.png)

偶然のおかげで、一応の「“解決策”」を発見しました：

ピクチャを消去する直前に、同じIDの別の画像をマップの反対側に表示させます。サイズは元の1%にスケールして。これで、画像が消える前にプラグインがマウスから外れたことを認識してくれます。  
完全にその場しのぎの応急処置ですが、同じ問題に遭っている方がいたら、一応これで動きます。

 ![image](https://us1.discourse-cdn.com/flex002/uploads/rpgmaker_community/original/2X/1/1b2bb9da5e8d3d2c4824d4818321af0187a7a714.png)

もっとスマートな解決策があれば、ぜひ見せてください！

---

<div class="post-metadata">

**Author:** ![Baz](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/baz/32/100_2.png) [@Baz](https://guild.rpgmakerofficial.com/u/Baz)\
**Post date:** [2026 年 10 月 30 日午後 3:13 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/4 "2026-10-30T15:13:53Z")

</div>

スクリーンショットでは「Use Global?」が true に設定されています。この設定が、下部の「Custom settings」を無視し、プラグインパラメータにある「Default Global Settings」を使用するようにコマンドに指示しているのかもしれません。これにより、そこで「Change Tone on Hover」を false に設定しても効果が現れない理由が説明つく可能性があります。そのコマンドで「Use Global?」を false に設定してみてください。もしその画像に最初からトーンが適用されていないなら、残留してしまうこともないはずです。

---

<div class="post-metadata">

**Author:** ![KamiStone](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/kamistone/32/9055_2.png) [@KamiStone](https://guild.rpgmakerofficial.com/u/KamiStone)\
**Post date:** [2026 年 10 月 30 日午後 10:23 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/5 "2026-10-30T22:23:08Z")

</div>

いや、そこが問題なんです ; 「デフォルトのグローバル設定」を有効にして「ホバー時にトーンを変更: False」に設定しても、何も変わりません。かなり不思議です。  
VisuStella にメールを送るつもりです。返信があれば、このトピックを更新します。  
それまで、もし他の解決策があれば、ぜひ共有してください（私の応急処置は 4 回に 1 回しか機能しないようですから……）

---

<div class="post-metadata">

**Author:** ![Baz](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/baz/32/100_2.png) [@Baz](https://guild.rpgmakerofficial.com/u/Baz)\
**Post date:** [2026 年 10 月 30 日午後 11:05 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/6 "2026-10-30T23:05:36Z")

</div>

MZコアスクリプトでは、ピクチャーが削除された際に、`onMouseExit` を呼び出さずにホバー状態が解除されてしまいます。おそらく、これによりピクチャー共通イベントが「トーンを解除すべきタイミング」を見逃してしまい、同じIDのピクチャーを再度表示した際に、残った色調（ティント）が適用されたままになってしまうのだと思われます。

VisuStellaのコードを変更せずにこの問題を回避できる可能性のある小さなプラグインを作成しました。マウスが最新の「ピクチャー表示」コマンド以降に実際にそのピクチャー上を通過していない限り、ピクチャーを元々の色調に戻すようにしています。これを `js/plugins` フォルダに `PictureHoverToneFix.js` として保存し、プラグインマネージャー内で `VisuMZ_4_PictureCmnEvts` の下に配置してください。

```auto
//=============================================================================
// PictureHoverToneFix.js
//=============================================================================

/*:
 * @target MZ
 * @plugindesc ピクチャーが削除され、再度表示された後もホバー時の色調が残存しないようにします。
 * @author Baz
 *
 * @param pictureIds
 * @text 対象ピクチャーID
 * @type number[]
 * @min 1
 * @default []
 * @desc この修正を適用するピクチャーのID。空欄の場合、すべてのピクチャーに適用されます。
 *
 * @help PictureHoverToneFix.js
 *
 * プラグインマネージャーで VisuMZ_4_PictureCmnEvts より下に配置してください。
 *
 * このプラグインは、最新の「ピクチャー表示」コマンド実行以降にマウスが実際に
 * そのピクチャー上を通過した場合のみ、ホバー時の色調を維持します。
 * それ以外の場合、色調とブレンドモードを、
 * 「ピクチャー表示」および「ピクチャー色調変更」で制御される、
 * そのピクチャー本来の設定値に戻します。
 *
 * プラグインコマンドはありません。
 */

(() => {
    const params = PluginManager.parameters("PictureHoverToneFix");
    const pictureIds = JSON.parse(params.pictureIds || "[]").map(Number);

    const isFixedPicture = pictureId =>
        pictureIds.length === 0 || pictureIds.includes(pictureId);

    const _Sprite_Picture_update = Sprite_Picture.prototype.update;
    Sprite_Picture.prototype.update = function() {
        _Sprite_Picture_update.call(this);
        this.updateHoverToneFix();
    };

    Sprite_Picture.prototype.updateHoverToneFix = function() {
        const picture = this.picture();
        if (!picture || !this.visible || !isFixedPicture(this._pictureId)) {
            return;
        }
        // 「ピクチャー表示」コマンドでは常に新しい Game_Picture オブジェクトが生成されるため、
        // オブジェクトが変化した場合、ピクチャーが新規に表示され、
        // ホバー状態ではない状態から開始することを意味します。
        if (this._hoverFixPicture !== picture) {
            this._hoverFixPicture = picture;
            this._hoverFixHovered = false;
        }
        if (!this.isBeingTouched()) {
            this._hoverFixHovered = false;
        } else if (TouchInput.isHovered()) {
            this._hoverFixHovered = true;
        }
        if (!this._hoverFixHovered) {
            this.setColorTone(picture.tone() || [0, 0, 0, 0]);
            this.blendMode = picture.blendMode();
        }
    };
})();

```

他のピクチャーの色調を変更するプラグインを使用している場合は、「対象ピクチャーID」パラメータに修正が必要なIDのみを指定することで、その他のピクチャーには影響を与えないように設定できます。

なお、ピクチャー共通イベントとの組み合わせでの動作確認はまだ行っていないため、もし色調の残存問題が解消されない場合はお知らせください。

---

<div class="post-metadata">

**Author:** ![KamiStone](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/kamistone/32/9055_2.png) [@KamiStone](https://guild.rpgmakerofficial.com/u/KamiStone)\
**Post date:** [2026 年 10 月 31 日午前 5:44 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/7 "2026-10-31T05:44:17Z")

</div>

わあ、ご協力いただき誠にありがとうございます。心から感謝いたします！  
残念ながら、問題の性質が変わってしまいました。スクリプトは1つの問題は解決してくれました：マウスが画像から離れたとき、画像に色調変化（ティント）が適用されなくなりました！しかし、同じ画像に再びマウスをホバーさせると色調変化が再び現れ、クリックするとイベントが発生しません。つまり、イベント自体は画像から切り離されたものの、「Change Tone on Hover（ホバー時の色調変更）」機能はまだバックグラウンドで動作しているようです。「Change Tone on Hover」機能を無効にしても、この問題は残ります。  
とても奇妙です。あなたのスクリプトにより、画像が消えるとホバー効果は画像から切り離されますが、色調変更機能はイベントが発生できなくなったにもかかわらず、依然としてアクティブなままです。

言い換えると、色調変化が永久に続くことはなくなりましたが、イベントとリンクが切れているにもかかわらず、ホバーするたびに再び現れます。

備考：画像にマウスをホバーさせた後、クリックしてイベントを発生させる前に画像が消えた場合に問題が発生します。画像が消える前にイベントを発生させた場合は、色調変化の問題は発生しなくなります。

---

<div class="post-metadata">

**Author:** ![Baz](https://sea2.discourse-cdn.com/flex002/user_avatar/guild.rpgmakerofficial.com/baz/32/100_2.png) [@Baz](https://guild.rpgmakerofficial.com/u/Baz)\
**Post date:** [2026 年 10 月 31 日午前 7:27 UTC](https://guild.rpgmakerofficial.com/t/topic/3480/8 "2026-10-31T07:27:21Z")

</div>

初版では、ピクチャにコモンイベントが残っているかどうかに関係なく、マウスがピクチャの上にある限りVisuStellaのトーンが適用されていました。

このバージョンでは、Picture Common Eventsコマンドも追跡します。「Clear」または「Erase & Clear」の実行後、そのピクチャIDは、「Change Picture Common Event」で再びイベントが割り当てられるまで、ホバー時のトーンが適用されません。また、このコマンドで「Use Global?」と「Change Tone on Hover?」の両方がfalseに設定されている場合もトーンをブロックします。1%ピクチャのテクニックも削除できます。ファイルを丸ごと以下のものに置き換えてください。

```auto
//=============================================================================
// PictureHoverToneFix.js
//=============================================================================

/*:
 * @target MZ
 * @plugindesc ピクチャを消去して再表示した後でも、ホバー時のトーンが残らないようにします。
 * @author Baz
 *
 * @param pictureIds
 * @text ピクチャID
 * @type number[]
 * @min 1
 * @default []
 * @desc この修正を適用するピクチャ。空のままにすると、すべてのピクチャに適用されます。
 *
 * @help PictureHoverToneFix.js
 *
 * プラグインマネージャーで、VisuMZ_4_PictureCmnEvtsより下にこのプラグインを配置してください。
 *
 * ピクチャのホバー時のトーンは、最後に「Show Picture」を実行して以降、マウスが実際にそのピクチャ上で移動した場合にのみ保持されます。
 *
 * 「Clear Picture Common Event」、「Erase & Clear Picture」、または「Clear All」コマンドを実行した後、そのピクチャには「Change Picture Common Event」でコモンイベントが再度割り当てられるまで、ホバー時のトーンは一切適用されません。「Use Global?」と「Change Tone on Hover?」の両方がfalseに設定されている「Change Picture Common Event」の場合も同様です。
 *
 * その他の場合は、トーンと合成モードがピクチャ自身の値（「Show Picture」と「Tint Picture」で制御される値）に戻されます。
 *
 * プラグインコマンドはありません。
 */

(() => {
    const params = PluginManager.parameters("PictureHoverToneFix");
    const pictureIds = JSON.parse(params.pictureIds || "[]").map(Number);
    const pictureCommonEventsName = "VisuMZ_4_PictureCmnEvts";

    const isFixedPicture = pictureId =>
        pictureIds.length === 0 || pictureIds.includes(pictureId);

    // Returns null when the command takes no picture IDs (the Clear All ones).
    const commandPictureIds = args => {
        if (!("PictureIDs:arraynum" in args)) {
            return null;
        }
        try {
            return JSON.parse(args["PictureIDs:arraynum"]).map(Number);
        } catch (e) {
            return [];
        }
    };

    const isFalse = value => String(value).trim() === "false";

    // Picture IDs that shouldn't get a hover tint, kept in save files.
    Game_Screen.prototype.hoverFixBlocked = function() {
        if (!this._hoverFixBlocked) {
            this._hoverFixBlocked = {};
        }
        return this._hoverFixBlocked;
    };

    const trackPictureCommonEvents = (commandName, args) => {
        args = args || {};
        const blocked = $gameScreen.hoverFixBlocked();
        const ids = commandPictureIds(args);
        if (commandName === "ChangePictureCommonEvent") {
            const hasCommonEvent = Number(args["CommonEventID:num"]) > 0;
            const toneOff =
                isFalse(args["UseGlobal:eval"]) && isFalse(args["ChangeTone:eval"]);
            for (const id of ids || []) {
                blocked[id] = !hasCommonEvent || toneOff;
            }
        } else if (ids) {
            for (const id of ids) {
                blocked[id] = true;
            }
        } else {
            for (let id = 1; id <= $gameScreen.maxPictures(); id++) {
                blocked[id] = true;
            }
        }
    };

    const _PluginManager_callCommand = PluginManager.callCommand;
    PluginManager.callCommand = function(self, pluginName, commandName, args) {
        if (pluginName === pictureCommonEventsName) {
            trackPictureCommonEvents(commandName, args);
        }
        _PluginManager_callCommand.call(this, self, pluginName, commandName, args);
    };

    const _Sprite_Picture_update = Sprite_Picture.prototype.update;
    Sprite_Picture.prototype.update = function() {
        _Sprite_Picture_update.call(this);
        this.updateHoverToneFix();
    };

    Sprite_Picture.prototype.updateHoverToneFix = function() {
        const picture = this.picture();
        if (!picture || !this.visible || !isFixedPicture(this._pictureId)) {
            return;
        }
        // Show Picture always makes a new Game_Picture, so a new object
        // means the picture was just shown and starts out not hovered.
        if (this._hoverFixPicture !== picture) {
            this._hoverFixPicture = picture;
            this._hoverFixHovered = false;
        }
        if (!this.isBeingTouched()) {
            this._hoverFixHovered = false;
        } else if (TouchInput.isHovered()) {
            this._hoverFixHovered = true;
        }
        const blocked = $gameScreen.hoverFixBlocked()[this._pictureId];
        if (blocked || !this._hoverFixHovered) {
            this.setColorTone(picture.tone() || [0, 0, 0, 0]);
            this.blendMode = picture.blendMode();
        }
    };
})();

```
