【解決】追加GUIの進捗バーが表示されない【1.7.10】

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.315644)

【解決】追加GUIの進捗バーが表示されない【1.7.10】

投稿記事by たいさん » 2018年4月10日(火) 21:41

自分はとあるMODのためにクラフト?ができるかまどのようなTileEntityとGUIを追加しました。
スロットは二つで、アイテムを入れて少し待ったらできるみたいな感じです。

そのGUIに進捗バーを表示させようと参考にしたものの通りにやってみても、表示されませんでした。
その後もあの手この手で解決を試みたのですが、やはり表示させることができませんでした。
エラーコードは出力されていません。
なので、この場で質問させていただきます。

コードは下のURLです
https://github.com/88taishi88/SobaMod

上のGitHubにすべてあります(バージョンも最新です)。
どうすれば表示されるでしょうか?

参考にしたものは次の二つです。
https://www.youtube.com/watch?v=BCyLEcNDUi8
https://github.com/Tsuteto/TofuCraft-MC1.7.10

至らぬ点もあるかもしれませんが、よろしくお願いします。
最後に編集したユーザー たいさん [ 2018年4月12日(木) 18:52 ], 累計 1 回
アバター
たいさん
ID:b3f6385d
石掘り
 
記事: 146
登録日時: 2014年8月30日(土) 16:48
お住まい: Eclipseの中

  • (PostNo.315646)

Re: 追加GUIの進捗バーが表示されない【1.7.10】

投稿記事by elise_blacklab » 2018年4月10日(火) 22:40

とりあえずTexturedじゃなくて単色でバーを描画してみて,それでも出ないようならTileEntityが同期されていないのが原因かと.
基本的にTileEntityの同期は自動ではやってくれないので,BlockかTileEntityに同期用の処理を仕込む必要があります.
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:54815e73
掘り廃人
 
記事: 2555
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.315680)

Re: 追加GUIの進捗バーが表示されない【1.7.10】

投稿記事by defeatedcrow » 2018年4月12日(木) 17:53

GUI上の描画に使うデータの同期はContainerクラスとGUIクラスに同期用処理が備わっています
(それを避けてTileEntityやブロックに独自パケットを飛ばす機能を実装も出来ますが、ここでは割愛します)

1.7であれば、ContainerクラスでICraftingというものを使えます
GUIを開いている間だけ、Containerクラス(サバ側)からGUIクラス(クラ側)へ同期パケットを送り続けるというもので、見た目に内容の変化が反映しないTileEntity(かまどなどインベントリ内だけで完結するもの)であればこれだけで済みます

Containerクラス内で
・addCraftingToCrafters(ICrafting par1ICrafting)メソッドでICraftingの登録
 送信する変数とこのクラスで使うIDを登録します
・detectAndSendChanges()メソッドでデータの送信処理
変化が生じたときだけパケットを送るなどが設定できます
・updateProgressBar(int par1, int par2)メソッドで受信処理
 送られてきた変数をTileEntityの変数に代入
このような流れです

GUIクラスでは、
drawGuiContainerBackgroundLayer(float par1, int x, int y)メソッド内あたりで、同期したデータを使ってゲージを描画します
bindTextureメソッドを呼んで今使いたいテクスチャを読み込ませてから、
・this.drawTexturedModalRect(x位置, y位置, テクスチャのx位置, テクスチャのy位置, テクスチャの幅, テクスチャの高さ)メソッドでテクスチャを部分描画
 ゲージを表現するなら、ここで変数に合わせて高さや幅を調整すればOK

表示は別にBackgroundLayerでなくてもよいのですが、もっと上のレイヤーに出すとツールチップより上に表示されてしまったりと不自然になるのでバックグラウンドにしています
GUI自体のテクスチャ表示より前に呼ぶと、上書きされて見えなくなるので注意


実装例が必要ならAMT2の例があるので、とりあえずContainerクラスとGUIクラスのやつをどうぞ
https://github.com/defeatedcrow/AppleMilkTea2_1.7.10/blob/master/java/mods/defeatedcrow/common/tile/appliance/ContainerAdvProcessor.java
https://github.com/defeatedcrow/AppleMilkTea2_1.7.10/blob/master/java/mods/defeatedcrow/client/gui/GuiAdvProcessor.java
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0790d4e9
ラピスラズリ収集家
 
記事: 1120
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.315683)

Re: 追加GUIの進捗バーが表示されない【1.7.10】

投稿記事by たいさん » 2018年4月12日(木) 18:52

defeatedcrow さんが書きました:GUI上の描画に使うデータの同期はContainerクラスとGUIクラスに同期用処理が備わっています
(それを避けてTileEntityやブロックに独自パケットを飛ばす機能を実装も出来ますが、ここでは割愛します)

1.7であれば、ContainerクラスでICraftingというものを使えます
GUIを開いている間だけ、Containerクラス(サバ側)からGUIクラス(クラ側)へ同期パケットを送り続けるというもので、見た目に内容の変化が反映しないTileEntity(かまどなどインベントリ内だけで完結するもの)であればこれだけで済みます

Containerクラス内で
・addCraftingToCrafters(ICrafting par1ICrafting)メソッドでICraftingの登録
 送信する変数とこのクラスで使うIDを登録します
・detectAndSendChanges()メソッドでデータの送信処理
変化が生じたときだけパケットを送るなどが設定できます
・updateProgressBar(int par1, int par2)メソッドで受信処理
 送られてきた変数をTileEntityの変数に代入
このような流れです

GUIクラスでは、
drawGuiContainerBackgroundLayer(float par1, int x, int y)メソッド内あたりで、同期したデータを使ってゲージを描画します
bindTextureメソッドを呼んで今使いたいテクスチャを読み込ませてから、
・this.drawTexturedModalRect(x位置, y位置, テクスチャのx位置, テクスチャのy位置, テクスチャの幅, テクスチャの高さ)メソッドでテクスチャを部分描画
 ゲージを表現するなら、ここで変数に合わせて高さや幅を調整すればOK

表示は別にBackgroundLayerでなくてもよいのですが、もっと上のレイヤーに出すとツールチップより上に表示されてしまったりと不自然になるのでバックグラウンドにしています
GUI自体のテクスチャ表示より前に呼ぶと、上書きされて見えなくなるので注意


実装例が必要ならAMT2の例があるので、とりあえずContainerクラスとGUIクラスのやつをどうぞ
https://github.com/defeatedcrow/AppleMilkTea2_1.7.10/blob/master/java/mods/defeatedcrow/common/tile/appliance/ContainerAdvProcessor.java
https://github.com/defeatedcrow/AppleMilkTea2_1.7.10/blob/master/java/mods/defeatedcrow/client/gui/GuiAdvProcessor.java


ありがとうございます!defeatedcrow様のURLを開き、試しにあげられたContainer側の三つのメゾットをオーバーライドしてみたら、UpdateProgressBarメゾットにエラーがでていて、
何故だろうと思ってよく見てみたらメゾット名が違っていました・・・・おそらく原因はこのメゾットが読み込まれてなかったからだと思われます。本当にあほらしいです・・・・・
あなたのおかげで気づくことができました、本当に、本当にありがとうございました!!!
アバター
たいさん
ID:b3f6385d
石掘り
 
記事: 146
登録日時: 2014年8月30日(土) 16:48
お住まい: Eclipseの中


Return to 質問:開発・制作関連

x