ページ 12

【解決】条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 12:41
by Arkroyal
こんにちは、お久しぶりです。いつもへんな質問ばかり持ってくる者です。

今回はdrawhpgaugeやdrawmpgaugeに関した質問です。



・作ろうとするもの
q1.png
q1.png (24.47 KiB) 閲覧された回数 3493 回
アクターが敵より10以上レベルが高くないと、敵の情報を見ることができなくするのが目的です。

戦闘は一対一で、アクターと敵のステータスは新しく作ったウィンドウで表示しております。






・現在の問題

drawhpgaugeとdrawmpgaugeにおいて、ifでレベルの差を条件に違う情報を表示しようとしましたけど、条件を無視して正常的にゲージが出力されます。

私がいじったdrawhpgaugeは

(読みずらいという話があったのでインデントしました。)

コード: 全て選択

	//↓私が作ったウィンドウのクラスです。
Teki_Info.prototype.drawActorHp = function(actor, x, y, width) { 
 width = width || 186;
 var color1 = this.hpGaugeColor1();
 var color2 = this.hpGaugeColor2();
 if ($gameActors.actor(1).level > $gameTroop.members()[0]._level+10) {
  this.drawGauge(x, y, width, actor.hpRate(), color1, color2);
  this.changeTextColor(this.systemColor());
  this.drawText(TextManager.hpA, x, y, 44);
  this.drawCurrentAndMax(actor.hp, actor.mhp, x, y, width,
                           this.hpColor(actor), this.normalColor());
    } else {
		//↓いつも満タンに見せるためrateを変更
  this.drawGauge(x, y, width, 1, color1, color2); 
  this.changeTextColor(this.systemColor());
  this.drawText(TextManager.hpA, x, y, 44);
		//↓現在値と最大値を見えないように
  this.drawCurrentAndMax("??", "??", x, y, width, 
                           this.hpColor(actor), this.normalColor());
};
このようになります。

これをthis.frawActorHpで出力させますが、条件を無視して普通のゲージが出力されます。

drawgaugeと関連したすべての関数をTeki_Infoのクラスに作っておいたけどゲージ隠しに失敗したのは、Teki_InfoではなくWindow_Baseの関数を使うからでしょうか?

皆様のアドバイスをお待ちさせていただきます。質問を読んでいただいて誠にありがとうございます。

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 15:21
by 名無し蛙
突っ込むのも野暮かもしれませんがelseの{}が欠けてるのはコピペミスではないですよね
コーディングにはVSCode等のテキストエディタを使用するのをオススメします
色分け、インデント補完等の補助機能で凡ミスを減らせます
あとは細かいところですがレベル10「以上」高いと可視化されるなら>ではなく>=ですね

他、Teki_Infoや$gameTroop.members()[0]._levelの詳細が分からない事には何とも言えませんが
テストプレイ中にf8を押してデベロッパーツールを出し
Consoleに赤字でエラーメッセージが表示されるなら教えてください

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 16:22
by Arkroyal
名無し蛙 さんが書きました:突っ込むのも野暮かもしれませんがelseの{}が欠けてるのはコピペミスではないですよね
コーディングにはVSCode等のテキストエディタを使用するのをオススメします
色分け、インデント補完等の補助機能で凡ミスを減らせます
あとは細かいところですがレベル10「以上」高いと可視化されるなら>ではなく>=ですね

他、Teki_Infoや$gameTroop.members()[0]._levelの詳細が分からない事には何とも言えませんが
テストプレイ中にf8を押してデベロッパーツールを出し
Consoleに赤字でエラーメッセージが表示されるなら教えてください


アドバイスありがとうございます。

インデントができていないことで気を使ってくださったみたいですね。不便な思いをさせてしまい申し訳ありません。

一応今もVSCodeを使ってコードをいじっていますが、ここにコードをインデントしたままにすると一部のコードが2行になって読みずらそうだったのでここではあえてコピペをしたあとインデントしたところを消しました。
q2.png
q2.png (48.15 KiB) 閲覧された回数 3445 回
+今確認してみたら何故か一段のインデントが無視されていますね。なぜでしょうか…

本文のコードを修正いたしました。指摘してくださったありがとうございます。

以上を>だけで書き込んだのはバカみたいなミスでしたね。申し訳ありません。



一つ理解できない部分がありますが、「elseの{}が欠けてる」ということはどういう意味でしょうか?

if (~~~) {
} else {
};

このような形で書き込みましたけど、どこか波括弧が抜けているのでしょうか?

あと戦闘画面はもちろんログ上でもエラーは起こっていません。

同じ条件を使った他の能力値の表示は???と出ているのを見ると、drawgaugeのところで私が何かを見落としているようですが、それが分からないのが現状です。

敵もアクターも同じレベル1で試しているので、以上を>で表現したことで起こった問題ではないと思います。

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 16:30
by ムノクラ
野暮を承知で…抜けてます。
コメントの付け方をこの様に上につければ、横に長くならずに済みますよね…

コード: 全て選択

//↓私が作ったウィンドウのクラスです。
Teki_Info.prototype.drawActorHp = function (actor, x, y, width) {
    width = width || 186;
    var color1 = this.hpGaugeColor1();
    var color2 = this.hpGaugeColor2();
    if ($gameActors.actor(1).level > $gameTroop.members()[0]._level + 10) {
        this.drawGauge(x, y, width, actor.hpRate(), color1, color2);
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.hpA, x, y, 44);
        this.drawCurrentAndMax(actor.hp, actor.mhp, x, y, width,
            this.hpColor(actor), this.normalColor());
    } else {
        //↓いつも満タンに見せるためrateを変更
        this.drawGauge(x, y, width, 1, color1, color2);
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.hpA, x, y, 44);
        //↓現在値と最大値を見えないように
        this.drawCurrentAndMax("??", "??", x, y, width,
            this.hpColor(actor), this.normalColor());
        //↓ } が抜けているのでは?
    }
};

※コードは投稿画面の「code」ボタンを押して出るタグでくくらないと、インデントは無視されます。

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 16:33
by Arkroyal
ムノクラ さんが書きました:野暮を承知で…抜けてます。
コメントの付け方をこの様に上につければ、横に長くならずに済みますよね…

コード: 全て選択

//↓私が作ったウィンドウのクラスです。
Teki_Info.prototype.drawActorHp = function (actor, x, y, width) {
    width = width || 186;
    var color1 = this.hpGaugeColor1();
    var color2 = this.hpGaugeColor2();
    if ($gameActors.actor(1).level > $gameTroop.members()[0]._level + 10) {
        this.drawGauge(x, y, width, actor.hpRate(), color1, color2);
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.hpA, x, y, 44);
        this.drawCurrentAndMax(actor.hp, actor.mhp, x, y, width,
            this.hpColor(actor), this.normalColor());
    } else {
        //↓いつも満タンに見せるためrateを変更
        this.drawGauge(x, y, width, 1, color1, color2);
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.hpA, x, y, 44);
        //↓現在値と最大値を見えないように
        this.drawCurrentAndMax("??", "??", x, y, width,
            this.hpColor(actor), this.normalColor());
        //↓ } が抜けているのでは?
    }
};

いまだに考え方が単純ですね、私は。今後は気をつけます。

「code」タグの事、確認いたしました。

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 16:53
by くろうど
こんにちは。

何をやりたいのかはなんとなく分かったのですが、そうなると、ソースコードの命名がおかしい気がするので、まずはそこを整理してはいかがでしょうか?

■疑問点
1. 関数名が drawActorHp となっているんですけど、敵キャラのゲージを表示するのでは?
2. 引数の actor って、何が入ってくるんですか?
3. if文で $gameTroop.members()[0]._level+10 と書いてますが、敵グループってレベルを持ってましたっけ?
4. そもそも、この Teki_Info って適切な継承をして、適切に new されているのでしょうか?
(つまり、この関数って呼ばれてます?)

まずは、この関数がちゃんと呼ばれている事を確認するといいかと思います。
よろしくおねがいします。

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 17:01
by Arkroyal
くろうど さんが書きました:こんにちは。

何をやりたいのかはなんとなく分かったのですが、そうなると、ソースコードの命名がおかしい気がするので、まずはそこを整理してはいかがでしょうか?

■疑問点
1. 関数名が drawActorHp となっているんですけど、敵キャラのゲージを表示するのでは?
2. 引数の actor って、何が入ってくるんですか?
3. if文で $gameTroop.members()[0]._level+10 と書いてますが、敵グループってレベルを持ってましたっけ?
4. そもそも、この Teki_Info って適切な継承をして、適切に new されているのでしょうか?
(つまり、この関数って呼ばれてます?)

まずは、この関数がちゃんと呼ばれている事を確認するといいかと思います。
よろしくおねがいします。



コメントありがとうございます。雑な出来で申し訳ありません。

コアースクリプトから必要な部分だけをとってきて作ったものなので、いろいろ抜けたところがあると思いますのでご了承ください。




1.Window_Baseで作られているdrawActorHpをそのまま使っています。

drawEnemyHpの関数を作ろうとしたもののそれがうまく行かなかったので、

drawActorHpでactorの部分に$gameTroop.members()[0]を入れて敵のゲージを作っています。



2.this.drawActorHp($gameTroop.members()[0],5,50,160) このような感じです。

Window_Baseにある関数をコピペした

Teki_Info.prototype.drawGauge
Teki_Info.prototype.drawActorHp
Teki_Info.prototype.drawActorMp

の関数を作っておきました。



3.DarkPlasma様のDarkPlasma_EnemyLevelプラグインを使って敵にレベルを追加しております。



4.以下のように宣言していますが、何か見落としたところがあるのでしょうか?

コード: 全て選択

Scene_Battle.prototype.createTekiWindow = function() {
	this._TekiWindow = new Teki_Info();
	this.addWindow(this._TekiWindow);
};

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 17:31
by くろうど
うーん。

よくよく考えたら、ゲージ以外は表示できてるんでしたっけ。

ちょっと試しに、drawActorHp 内の if文をコメントアウトして、必ず、else側の処理(??を表示する)を通るようにして確認してはいかがでしょうか?

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 17:40
by Arkroyal
くろうど さんが書きました:うーん。

よくよく考えたら、ゲージ以外は表示できてるんでしたっけ。

ちょっと試しに、drawActorHp 内の if文をコメントアウトして、必ず、else側の処理(??を表示する)を通るようにして確認してはいかがでしょうか?

コード: 全て選択

Teki_Info.prototype.drawActorHp = function(actor, x, y, width) {
    width = width || 186;
    var color1 = this.hpGaugeColor1();
    var color2 = this.hpGaugeColor2();
    this.drawGauge(x, y, width, 1, color1, color2);
    this.changeTextColor(this.systemColor());
    this.drawText(TextManager.hpA, x, y, 44);
    this.drawCurrentAndMax("??", "??", x, y, width,
                           this.hpColor(actor), this.normalColor());
q3.png
q3.png (21.81 KiB) 閲覧された回数 3405 回
提案してくださった通り、drawActorHpに情報を隠す方を入れてみました。

結果は情報が隠されず、普通のゲージが描かれました。

これはTeki_InfoクラスのdrawActorHpは無視されて、Window_Baseの方が使われているのでしょうか?

Re: 条件を満たさないとゲージを??にする方法

Posted: 2021年4月01日(木) 18:38
by くろうど
Arkroyal さんが書きました: これはTeki_InfoクラスのdrawActorHpは無視されて、Window_Baseの方が使われているのでしょうか?
おそらく、そうだと思います。

シーンクラス側からだと、

コード: 全て選択

this._TekiWindow.drawActorHp(...省略...);
 
で呼べると思います。
(クラスと関数の役割としては、Windowクラス内で呼ぶのが良いと思います)

ここらへんは他のクラスを参考にできると思います。
よろしくおねがいします。