Javaスクリプトの基本知識が無く、常識的な質問でしたら申し訳ございません。
現在作成中のゲームのステータスや装備画面で、アクターのイメージを大きなpng画像を使用して表示しております。
しかし、装備画面で装備リストをアクターのイメージ画像を表示するウィンドウの上に表示させたところ、
ウィンドウが重なった部分のイメージ画像が欠けてしまいました。
(添付の画像のように、キャラクターの画像が、装備のリストのウィンドウに重なった箇所が消えてしまいます)
RPGツクールMZでウィンドウが重なった時に、
後ろの画像を欠けさせずに表示する処理はどのようにすればよいのでしょうか?
現在は、"Window_EquipStatus.prototype"の"drawActorFace"を改良して、本来アクターのフェイス画像を表示する処理のところを、ピクチャーを表示するようにしております。
(イメージ画像)
[img]EquipScene_LayerCheck.png[/img]
【解決済】ウィンドウを重ねた時に後ろにある情報が消えないようにしたい
- Sadame Hanabiki
- 記事: 14
- 登録日時: 2020年9月10日(木) 21:59
【解決済】ウィンドウを重ねた時に後ろにある情報が消えないようにしたい
最後に編集したユーザー Sadame Hanabiki [ 2022年11月29日(火) 20:28 ], 累計 1 回
Re: ウィンドウを重ねた時に後ろにある情報が消えないようにしたい
軽く確認した範囲だと多分ウィンドウレイヤの仕様じゃないですか。
シーンクラスのチルドレンにウィンドウレイヤというものがあり
addWindowするとウィンドウレイヤによって管理されます。
そしてウィンドウレイヤのrender処理で
下に存在するウィンドウを描画しないように特殊な処理を組んでるみたいですね。
つまりこのrender処理をスーパークラスのrender処理に差し替えれば良いのでは。
例えば装備画面限定でウィンドウレイヤのレンダー処理の仕様を元に戻すのなら
という処理を自作プラグイン内に書き加える、とか。
そもそもなんでこんな特殊な処理を組んでるのかと言えば
アイテム/スキル画面でアクター選択ウィンドウを出した時に見易くする為、だと思います。
ので、全てのWindowLayerに変更を適用しても良いのなら
だけでも良いです。
シーンクラスのチルドレンにウィンドウレイヤというものがあり
コード: 全て選択
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);
};
コード: 全て選択
Scene_Base.prototype.addWindow = function(window) {
this._windowLayer.addChild(window);
};
下に存在するウィンドウを描画しないように特殊な処理を組んでるみたいですね。
コード: 全て選択
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();
};
例えば装備画面限定でウィンドウレイヤのレンダー処理の仕様を元に戻すのなら
コード: 全て選択
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: 【解決済】ウィンドウを重ねた時に後ろにある情報が消えないようにしたい
ご返信が遅くなり申し訳ございません。
おかげ様で無事解決することが出来ました。
どうもありがとうございました。
おかげ様で無事解決することが出来ました。
どうもありがとうございました。