【解決済】ウィンドウを重ねた時に後ろにある情報が消えないようにしたい

アバター
Sadame Hanabiki
記事: 14
登録日時: 2020年9月10日(木) 21:59

【解決済】ウィンドウを重ねた時に後ろにある情報が消えないようにしたい

投稿記事by Sadame Hanabiki » 2022年10月17日(月) 16:11

Javaスクリプトの基本知識が無く、常識的な質問でしたら申し訳ございません。

現在作成中のゲームのステータスや装備画面で、アクターのイメージを大きなpng画像を使用して表示しております。
しかし、装備画面で装備リストをアクターのイメージ画像を表示するウィンドウの上に表示させたところ、
ウィンドウが重なった部分のイメージ画像が欠けてしまいました。
(添付の画像のように、キャラクターの画像が、装備のリストのウィンドウに重なった箇所が消えてしまいます)

RPGツクールMZでウィンドウが重なった時に、
後ろの画像を欠けさせずに表示する処理はどのようにすればよいのでしょうか?

現在は、"Window_EquipStatus.prototype"の"drawActorFace"を改良して、本来アクターのフェイス画像を表示する処理のところを、ピクチャーを表示するようにしております。



(イメージ画像)
[img]EquipScene_LayerCheck.png[/img]
添付ファイル
EquipScene_LayerCheck.png
最後に編集したユーザー Sadame Hanabiki on 2022年11月29日(火) 20:28 [ 編集 1 回目 ]

名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: ウィンドウを重ねた時に後ろにある情報が消えないようにしたい

投稿記事by 名無し蛙 » 2022年10月20日(木) 21:36

軽く確認した範囲だと多分ウィンドウレイヤの仕様じゃないですか。
シーンクラスのチルドレンにウィンドウレイヤというものがあり

コード: 全て選択

Scene_Base.prototype.createWindowLayer = function() {
    this._windowLayer = new WindowLayer();
    this._windowLayer.x = (Graphics.width - Graphics.boxWidth) / 2;
    this._windowLayer.y = (Graphics.height - Graphics.boxHeight) / 2;
    this.addChild(this._windowLayer);
};

addWindowするとウィンドウレイヤによって管理されます。

コード: 全て選択

Scene_Base.prototype.addWindow = function(window) {
    this._windowLayer.addChild(window);
};

そしてウィンドウレイヤのrender処理で
下に存在するウィンドウを描画しないように特殊な処理を組んでるみたいですね。

コード: 全て選択

WindowLayer.prototype.render = function render(renderer) {
    if (!this.visible) {
        return;
    }

    const graphics = new PIXI.Graphics();
    const gl = renderer.gl;
    const children = this.children.clone();

    renderer.framebuffer.forceStencil();
    graphics.transform = this.transform;
    renderer.batch.flush();
    gl.enable(gl.STENCIL_TEST);

    while (children.length > 0) {
        const win = children.pop();
        if (win._isWindow && win.visible && win.openness > 0) {
            gl.stencilFunc(gl.EQUAL, 0, ~0);
            gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
            win.render(renderer);
            renderer.batch.flush();
            graphics.clear();
            win.drawShape(graphics);
            gl.stencilFunc(gl.ALWAYS, 1, ~0);
            gl.stencilOp(gl.REPLACE, gl.REPLACE, gl.REPLACE);
            gl.blendFunc(gl.ZERO, gl.ONE);
            graphics.render(renderer);
            renderer.batch.flush();
            gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
        }
    }

    gl.disable(gl.STENCIL_TEST);
    gl.clear(gl.STENCIL_BUFFER_BIT);
    gl.clearStencil(0);
    renderer.batch.flush();

    for (const child of this.children) {
        if (!child._isWindow && child.visible) {
            child.render(renderer);
        }
    }

    renderer.batch.flush();
};

つまりこのrender処理をスーパークラスのrender処理に差し替えれば良いのでは。
例えば装備画面限定でウィンドウレイヤのレンダー処理の仕様を元に戻すのなら

コード: 全て選択

    const _Scene_Equip_createWindowLayer = Scene_Equip.prototype.createWindowLayer;
    Scene_Equip.prototype.createWindowLayer = function() {
        _Scene_Equip_createWindowLayer.apply(this, arguments);
        this._windowLayer.render = PIXI.Container.prototype.render;
    };

という処理を自作プラグイン内に書き加える、とか。
そもそもなんでこんな特殊な処理を組んでるのかと言えば
アイテム/スキル画面でアクター選択ウィンドウを出した時に見易くする為、だと思います。
ので、全てのWindowLayerに変更を適用しても良いのなら

コード: 全て選択

WindowLayer.prototype.render = PIXI.Container.prototype.render;

だけでも良いです。
アバター
Sadame Hanabiki
記事: 14
登録日時: 2020年9月10日(木) 21:59

Re: 【解決済】ウィンドウを重ねた時に後ろにある情報が消えないようにしたい

投稿記事by Sadame Hanabiki » 2022年11月29日(火) 20:29

ご返信が遅くなり申し訳ございません。
おかげ様で無事解決することが出来ました。
どうもありがとうございました。

“MZ:質問” へ戻る