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

Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

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

投稿記事 by Arkroyal »

くろうど さんが書きました:
Arkroyal さんが書きました: これはTeki_InfoクラスのdrawActorHpは無視されて、Window_Baseの方が使われているのでしょうか?
おそらく、そうだと思います。

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

コード: 全て選択

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

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




やってみたところ、TypeError: Cannot read property 'drawActorHp' of undefinedのエラーが出ます。

コード: 全て選択

    Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
    };
これで_TekiWindowはTeki_Infoであることを宣言して、



コード: 全て選択

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());
これでTeki_InfoクラスにdrawActorHpの関数を作り、


コード: 全て選択

Teki_Info.prototype.refresh = function() {
    this.contents.clear();
	this._TekiWindow.drawActorHp($gameTroop.members()[0],5,50,160);
Teki_InfoウィンドウにこのクラスのdrawActorHp関数を呼んだはずなのに、なぜdrawActorHpがないとエラーが出るのでしょうか?

クラス名と関数名以外は新しく作ったものがないのに、var文が必要なんでしょうか?

もしくは敵専用のゲージを描く関数を作るべきみたいですね…。
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

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

投稿記事 by くろうど »

Arkroyal さんが書きました:

コード: 全て選択

Teki_Info.prototype.refresh = function() {
    this.contents.clear();
	this._TekiWindow.drawActorHp($gameTroop.members()[0],5,50,160);
Teki_InfoウィンドウにこのクラスのdrawActorHp関数を呼んだはずなのに、なぜdrawActorHpがないとエラーが出るのでしょうか?

クラス名と関数名以外は新しく作ったものがないのに、var文が必要なんでしょうか?

もしくは敵専用のゲージを描く関数を作るべきみたいですね…。
えーと、先程のは、シーンクラス側から呼ぶ想定で書いたものなので、
Teki_Info.prototype がついてる所の中なら、

コード: 全て選択

this.drawActorHp(...省略...);
になります。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

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

投稿記事 by くろうど »

追記です。

念の為、コアスクリプトを確認したら、
Window_Base には refresh が無いようなので、
refresh の中に書いても動かない気がします。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

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

投稿記事 by Arkroyal »

くろうど さんが書きました:
Arkroyal さんが書きました:

コード: 全て選択

Teki_Info.prototype.refresh = function() {
    this.contents.clear();
	this._TekiWindow.drawActorHp($gameTroop.members()[0],5,50,160);
Teki_InfoウィンドウにこのクラスのdrawActorHp関数を呼んだはずなのに、なぜdrawActorHpがないとエラーが出るのでしょうか?

クラス名と関数名以外は新しく作ったものがないのに、var文が必要なんでしょうか?

もしくは敵専用のゲージを描く関数を作るべきみたいですね…。
えーと、先程のは、シーンクラス側から呼ぶ想定で書いたものなので、
Teki_Info.prototype がついてる所の中なら、

コード: 全て選択

this.drawActorHp(...省略...);
になります。

this.drawActorHpなら、質問をするときに使っていたものですね。

Window_Baseではrefreshではなくupdateなんでしょうか?




追記

教えてくださった通り、試しにTeki_Infoのrefreshをupdateに変えてみたんですが、同じ結果になりました…。

やはり敵専用のゲージ関数を作る方がいいんでしょうか?
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

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

投稿記事 by くろうど »

Window_Base が refresh を持っていないなら、表示したいタイミングで draw するのがイイかもしれません。
(クラスの役割としてどうなのかは未確認)

その前の話によると、Window自体はScene_Battleが持っていると思います。

コード: 全て選択

 Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
    };
なので、例えば、試しに、

コード: 全て選択

 Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
        
        this._TekiWindow.drawActorHp($gameTroop.members()[0], 10, 20); // 例
    };
とすれば、敵キャラデータがこのタイミングで存在していれば、ゲージが表示されると思います。

エラーになる場合は、show関数を実行している所でやってみるのがイイと思います。

コード: 全て選択

this._TekiWindow.show();
this._TekiWindow.drawActorHp($gameTroop.members()[0], 10, 20); // 例
尚、上記の場合、今表示されているゲージと重なって表示される気がしますので、今表示されているゲージをどこで表示しているのかは突き止める必要があるかと思います。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

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

投稿記事 by Arkroyal »

くろうど さんが書きました:Window_Base が refresh を持っていないなら、表示したいタイミングで draw するのがイイかもしれません。
(クラスの役割としてどうなのかは未確認)

その前の話によると、Window自体はScene_Battleが持っていると思います。

コード: 全て選択

 Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
    };
なので、例えば、試しに、

コード: 全て選択

 Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
        
        this._TekiWindow.drawActorHp($gameTroop.members()[0], 10, 20); // 例
    };
とすれば、敵キャラデータがこのタイミングで存在していれば、ゲージが表示されると思います。

エラーになる場合は、show関数を実行している所でやってみるのがイイと思います。

コード: 全て選択

this._TekiWindow.show();
this._TekiWindow.drawActorHp($gameTroop.members()[0], 10, 20); // 例
尚、上記の場合、今表示されているゲージと重なって表示される気がしますので、今表示されているゲージをどこで表示しているのかは突き止める必要があるかと思います。



ご指導ありがとうございます。

読んでみたところ、くろうど様の例えにおいて一つ分からない部分があるのですが、

createTekiWindowはウィンドウを作る部分なのでその中身はここでは追加できないのではないでしょうか?

戦闘において敵キャラ―のデータの有無の判断はcreateTekiWindow自体ではできないと思いますが、なにか私が勘違いをしているのでしょうか…?

コード: 全て選択

Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
        this._TekiWindow.drawActorHp($gameTroop.members()[0],5,50,160);
    };
をしてみたところ、エラーは起こりませんがゲージは表示されませんでした。
q4.png
q4.png (19.63 KiB) 閲覧された回数 3548 回
(確認のため Teki_Info.prototype.update からthis.drawActorHp($gameTroop.members()[0],5,50,160)をコメントアウトして、

Scene_Battle.prototype.createTekiWindow = function()に入れた結果です。)
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

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

投稿記事 by くろうど »

Arkroyal さんが書きました: createTekiWindowはウィンドウを作る部分なのでその中身はここでは追加できないのではないでしょうか?

戦闘において敵キャラ―のデータの有無の判断はcreateTekiWindow自体ではできないと思いますが、なにか私が勘違いをしているのでしょうか…?

コード: 全て選択

Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
        this._TekiWindow.drawActorHp($gameTroop.members()[0],5,50,160);
    };
をしてみたところ、エラーは起こりませんがゲージは表示されませんでした。

q4.png

(確認のため Teki_Info.prototype.update からthis.drawActorHp($gameTroop.members()[0],5,50,160)をコメントアウトして、

Scene_Battle.prototype.createTekiWindow = function()に入れた結果です。)
その部分はその認識で合ってると思います。
書き方の例として、たぶんエラーが起こる想定で言いました。

書く場所は、Scene_Battle 内の

コード: 全て選択

this._TekiWindow.drawなんとか
または、

コード: 全て選択

this._TekiWindow.show();
がある辺りになると思います。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

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

投稿記事 by Arkroyal »

くろうど さんが書きました:
Arkroyal さんが書きました: createTekiWindowはウィンドウを作る部分なのでその中身はここでは追加できないのではないでしょうか?

戦闘において敵キャラ―のデータの有無の判断はcreateTekiWindow自体ではできないと思いますが、なにか私が勘違いをしているのでしょうか…?

コード: 全て選択

Scene_Battle.prototype.createTekiWindow = function() {
        this._TekiWindow = new Teki_Info();
        this.addWindow(this._TekiWindow);
        this._TekiWindow.drawActorHp($gameTroop.members()[0],5,50,160);
    };
をしてみたところ、エラーは起こりませんがゲージは表示されませんでした。

q4.png

(確認のため Teki_Info.prototype.update からthis.drawActorHp($gameTroop.members()[0],5,50,160)をコメントアウトして、

Scene_Battle.prototype.createTekiWindow = function()に入れた結果です。)
その部分はその認識で合ってると思います。
書き方の例として、たぶんエラーが起こる想定で言いました。

書く場所は、Scene_Battle 内の

コード: 全て選択

this._TekiWindow.drawなんとか
または、

コード: 全て選択

this._TekiWindow.show();
がある辺りになると思います。


showは使っていないのでupdateやsetTextなどにthis._TekiWindow.drawActorHpを入れてみましたけど、

相変わらずTeki_InfoのdrawActorHp(drawCurrentAndMaxが両方??に出るようにしたもの)ではなくWindow_BaseのdrawActorHpを使う模様です。現在値と最大値がそのまま出ていますからね…。

コード: 全て選択

    var _Scene_Battle_update = Scene_Battle.prototype.update;
    Scene_Battle.prototype.update = function() {
        _Scene_Battle_update.call(this);
        this._PlayerWindow.setText();
        this._TekiWindow.setText();
        this._TekiWindow.drawActorHp($gameTroop.members()[0],5,50,160);
    };
こうすることで一様ゲージの出力は成功しました。Scene_Battle.prototype.createTekiWindowではゲージすら出なかったのとは違いがありますね。



コード: 全て選択

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());
現在Teki_InfoのdrawActorHpはこんなふうになっています。
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

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

投稿記事 by くろうど »

基本的に、SceneクラスでWindowクラスをnewしてaddChildして、一旦hideしておいて、表示したいタイミングでshowすると思っているのですが、showしていないということは表示しっぱなしなんでしょうか?

とは言え、今やってることは、
関数の処理を通っているのかどうかを確認しているだけなので、
Teki_Info.prototype.drawActorHp の中に、
console.log("Teki_InfoのdrawActorHp 通過"); を追加して、
F8またはF12のデベロッパーツールを開いて
コンソールログに表示されるかを確認してもらうのが、
とりあえず手っ取り早い気がします。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

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

投稿記事 by Arkroyal »

くろうど さんが書きました:基本的に、SceneクラスでWindowクラスをnewしてaddChildして、一旦hideしておいて、表示したいタイミングでshowすると思っているのですが、showしていないということは表示しっぱなしなんでしょうか?

とは言え、今やってることは、
関数の処理を通っているのかどうかを確認しているだけなので、
Teki_Info.prototype.drawActorHp の中に、
console.log("Teki_InfoのdrawActorHp 通過"); を追加して、
F8またはF12のデベロッパーツールを開いて
コンソールログに表示されるかを確認してもらうのが、
とりあえず手っ取り早い気がします。

console.logで関数が処理されたのかを確認する方法…勉強になりました!

確認してみたところ、ログの出力はありませんでした。

Window_Base.prototype.drawActorHpにconsole.logを入れてみるとログがいっぱいになったので、くろうど様の推測があっているみたいです。

必ずTeki_Infoの関数を通るようにするのはできないみたいなので、独自ウィンドウの勉強はここまでにしてWindow_BaseにdrawEnemyHp関数を作ってする楽な方を選択します…。

夜遅い時間まで初心者の出来損ないスクリプトに付き合ってくださって誠にありがとうございました…!





追記

showのことを忘れていました。申し訳ありません。

私が作ったステータスはbusyに関係なく、戦闘画面において常に右側に現れているようにしたのでshowやhideは使いませんでした。
返信する

“MV:質問”に戻る