【解決済み】敵ターゲットウィンドウにHPゲージを表示させたい

ヨスカ
記事: 2
登録日時: 2023年1月31日(火) 16:34

【解決済み】敵ターゲットウィンドウにHPゲージを表示させたい

投稿記事by ヨスカ » 2023年1月31日(火) 17:41

プラグイン開発を勉強中の者です。

敵ターゲットウィンドウにHPゲージを表示したものの
倒した敵のHPゲージがそのまま残り続けてしまうため、解決方法をご教示いただきたいです。

作成中のプラグインが下記になります。

コード: 全て選択

 (() =>{
    "use strict";

    //Window_BattleEnemyのdrawItmeメソッドを再定義
    const _Window_BattleEnemy_prototype_drawItem = Window_BattleEnemy.prototype.drawItem;
    Window_BattleEnemy.prototype.drawItem = function(index) {
        _Window_BattleEnemy_prototype_drawItem.apply(this, arguments);
        this.createHpGaugeSprite(index);       
    }

    Window_BattleEnemy.prototype.createHpGaugeSprite = function(index){
        const rect = this.itemLineRect(index);

        //HPゲージを作成、子オブジェクトとして追加
        this._hpGaugeSprite = new Sprite_Gauge();
        this.addChild(this._hpGaugeSprite);   
        this._hpGaugeSprite.setup(this._enemies[index], "hp");

        //HPゲージのラベルと値を非表示
        this._hpGaugeSprite.drawLabel = function(){}
        this._hpGaugeSprite.drawValue = function(){}

        //HPゲージ位置を変更
        this._hpGaugeSprite.x = rect.x;
        this._hpGaugeSprite.y = rect.y;
        const x = this._hpGaugeSprite.x - 40;
        const y = this._hpGaugeSprite.y + 24 + 17;
        this._hpGaugeSprite.move(x, y, rect.width, rect.height);

        //HPゲージ幅を変更
        const _Sprite_Gauge_bitmapWidth = Sprite_Gauge.prototype.bitmapWidth;
        Sprite_Gauge.prototype.bitmapWidth = function () {
        const isSceneBattle = SceneManager._scene.constructor.name === 'Scene_Battle';
        return isSceneBattle ? 430 : _Sprite_Gauge_bitmapWidth.call(this);
        };

        //文字領域(敵の名前)高さを変更
        const _WindowBase_prototype_lineHeight = Window_Base.prototype.lineHeight;
        Window_Base.prototype.lineHeight = function() {
            _WindowBase_prototype_lineHeight.call(this);
            return 52;
        };
 
    };

})();

n体いる敵のうち1体を倒した場合、Indexが-1になるため(この場合は 0, 1, 2が 0, 1になるため)
n番目のゲージがそのまま残り続けているものと推測しています。
addchild先をSprite_Enemyにすれば敵画像が消えたらゲージも消えるのでは…?と試行錯誤してはいるのですが
なんとか敵の名前の下にゲージを表示できないものでしょうか。

また、ゲージ幅の変更や文字領域高さの変更は敵選択ウィンドウ表示時のみに限りたいのですが
他のシーンでも影響が出てしまっているため、適用範囲の制限方法についても教えていただけたら幸いです。

本プラグインは、茶の助様が作成・公開されているMV用のHPゲージ表示プラグインを参考にしており
同様の機能を再現しつつ、レイアウトの調整ができるものを作りたいと考えております。
『ターゲットHP表示 - TYA_EnemyHPGauge.js』
http://tyamvplugin.blog.shinobi.jp/mvpl ... 8%E7%A4%BA

以上、お力添えいただきたくよろしくお願いいたします。
添付ファイル
質問画像2.png
質問画像1.png
最後に編集したユーザー ヨスカ on 2023年2月02日(木) 00:08 [ 編集 1 回目 ]

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

Re: 敵ターゲットウィンドウにHPゲージを表示させたい

投稿記事by 名無し蛙 » 2023年1月31日(火) 21:10

そういえばMVからMZでゲージ表示周りが面倒くさい仕様変更したんでしたね
参考にするとしたらWindow_StatusBaseでしょうね

①使用するゲージスプライトを連想配列に保存して管理する
②リフレッシュ時の処理の頭に全てのゲージスプライトを非表示にする

の二点で再現出来るんじゃないですか。
現状、リフレッシュする度にスプライトが蓄積していくのでこの構造はかなり良くないです。

あとはこういう取得メソッドまで処理の退避をする必要がないし、
Window_BattleEnemyだけ適用するならWindow_Baseの方を弄る必要がないと思います。

コード: 全て選択

        //文字領域(敵の名前)高さを変更
        const _WindowBase_prototype_lineHeight = Window_Base.prototype.lineHeight;
        Window_Base.prototype.lineHeight = function() {
            _WindowBase_prototype_lineHeight.call(this);
            return 52;
        };
        ↓
        Window_BattleEnemy.prototype.lineHeight = function() {
            return 52;
        };

追記:
コスカ さんが書きました:また、ゲージ幅の変更や文字領域高さの変更は敵選択ウィンドウ表示時のみに限りたいのですが
他のシーンでも影響が出てしまっているため、適用範囲の制限方法についても教えていただけたら幸いです。

コード: 全て選択

       //HPゲージ幅を変更
        const _Sprite_Gauge_bitmapWidth = Sprite_Gauge.prototype.bitmapWidth;
        Sprite_Gauge.prototype.bitmapWidth = function () {
        const isSceneBattle = SceneManager._scene.constructor.name === 'Scene_Battle';
        return isSceneBattle ? 430 : _Sprite_Gauge_bitmapWidth.call(this);
        };

この部分もクラス定義側で変えるのではなく、インスタンス側で変えた方が良いと思いますね。

コード: 全て選択

sprite.bitmapWidth = () => 430;
sprite.bitmap.destroy();
sprite.createBitmap(); // bitmapの再生成
ヨスカ
記事: 2
登録日時: 2023年1月31日(火) 16:34

Re: 敵ターゲットウィンドウにHPゲージを表示させたい

投稿記事by ヨスカ » 2023年1月31日(火) 23:51

ご回答ありがとうございます。
①使用するゲージスプライトを連想配列に保存して管理する
②リフレッシュ時の処理の頭に全てのゲージスプライトを非表示にする
こちら、Window_StatusBaseを確認した上で試してみます。

コード: 全て選択

sprite.bitmapWidth = () => 430;
sprite.createBitmap(); // bitmapの再生成

以前、インスタンス側でいくら変更しても反映されないと思いクラス側から変更してしまったのですが、
再生成の必要があるのですね。こちらで上手くいきました!

“MZ:質問” へ戻る