質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1862閲覧

(初心者)クラスやメソッドの読み方

feeling_jumper

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/08/07 11:55

Java初心者です。

マインクラフトのMod開発で、レシピの追加というのがあるのですが、
クラスやメソッドの読み方がわからず困っています。

例として欲しい回答としては、
「~クラスのAメソッドが引数〜を渡して、〜クラスのBメソッドが受けとって〜」
という感じに、どういう流れで処理が進んでいるのかが知りたいです。

実際のソースですが、レシピの追加は下記のような記述がされています。

java

1GameRegistry.addRecipe(new ItemStack(Items.diamond),"#","#","#",'#',Blocks.dirt);

上記の1行から、初心者の私は、addRecipeメソッドに何個か引数を渡せば、
レシピの追加ができるんだな〜というぐらいなのですが、、、

javaって、クラスやメソッドだけでは動かなくて、
クラス(設計図)を元に、動いてくれる実態(オブジェクト)が必要と本で読んだのですが、

この場合、「レシピを作る」(設計図)クラスが、GameRegistryクラスで、
その中のaddRecipeメソッドがその機能になりますか?

そして、ItemStackという設計図を元に、
ダイヤモンドのレシピという要素を持ったオブジェクトであるitemが生成され、
そのオブジェクト自体をメソッドに渡しているということでしょうか...?
※単に、レシピっていう要素自体を渡しているということでしょうか・・

addRecipeメソッドに渡しているのは、
(①ダイヤモンドのレシピ自体と、②なんか「#」の連続と、③ブロックである砂)
の3つの引数を渡しているということで、

そのaddRecipeメソッドは、受け取った引数を、今度は、
addShapedRecipeメソッドに渡していて、

java

1public static void addRecipe(ItemStack output, Object... params) 2 { 3 addShapedRecipe(output, params); 4 } 5 6 public static IRecipe addShapedRecipe(ItemStack output, Object... params) 7 { 8 return CraftingManager.getInstance().addRecipe(output, params); 9 }

addShapeRecipeは受け取った引数をさらに
CraftingManagerのgetInstanceメソッドのaddRecipeに渡していますよね。

java

1public class CraftingManager 2{ 3 /** The static instance of this class */ 4 private static final CraftingManager instance = new CraftingManager(); 5 /** A list of all the recipes added */ 6 private List recipes = new ArrayList(); 7 private static final String __OBFID = "CL_00000090"; 8 9 /** 10 * Returns the static instance of this class 11 */ 12 public static final CraftingManager getInstance() 13 { 14 /** The static instance of this class */ 15 return instance; 16 } 17 18 private CraftingManager() 19 { 20 (new RecipesTools()).addRecipes(this); 21 (new RecipesWeapons()).addRecipes(this); 22 (new RecipesIngots()).addRecipes(this); 23 (new RecipesFood()).addRecipes(this); 24 (new RecipesCrafting()).addRecipes(this); 25 (new RecipesArmor()).addRecipes(this); 26 (new RecipesDyes()).addRecipes(this); 27 this.recipes.add(new RecipesArmorDyes()); 28 this.recipes.add(new RecipeBookCloning()); 29 this.recipes.add(new RecipesMapCloning()); 30 this.recipes.add(new RecipesMapExtending()); 31 this.recipes.add(new RecipeFireworks()); 32 this.addRecipe(new ItemStack(Items.paper, 3), new Object[] {"###", '#', Items.reeds}); 33 this.addShapelessRecipe(new ItemStack(Items.book, 1), new Object[] {Items.paper, Items.paper, Items.paper, Items.leather}); 34353637 省略

つまりaddShapeRecipeがCraftingManagerクラスのメソッドに引数を渡すことで、
レシピの追加ができているということでしょうか。

で、わからないのが、この最後にCraftingManagerクラスのメソッドに渡しているところなんですが、
引数をどこに渡しているのかがわからないんです。

java

1public static IRecipe addShapedRecipe(ItemStack output, Object... params) 2 { 3 return CraftingManager.getInstance().addRecipe(output, params); 4 }

さっきのこのreturnの箇所なんですが、
これがCraftingManagerクラスのどこと関連しているのか知りたいです。

そして、これらの「レシピを生成する」という機能は、
クラス(設計図)だけじゃう動かないよ!って本に書いてあるんですが、
これらを機能させるためのオブジェクトとはどこのことなんでしょうか。

長文ですみません。・゚゚・(>_<;)・゚゚・。
また前回の質問で、解決済みなのにコメントしてしまい、
すみませんでした。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/08/07 12:38

非公式のフォーラムがあるようですが、そちらで聞かれた方がより専門的な回答を得られると思います。http://forum.minecraftuser.jp/ 幅広く意見を求めるのは間違いではないですが、確実に専門的な知識を持っている人がいる専用のコミュニティと、いるかどうか分からないQAサイト どちらが確実かというと明白に思いますが。(いずれにしてもJavaに限らずプログラミング自体の理解度がまだまだ薄そうなのでそれ以前の問題ではありますが)
feeling_jumper

2018/08/07 12:41

そのフォーラムでも質問しています。
m.ts10806

2018/08/07 12:43

マルチポストは非推奨です。ヘルプをきちんと読んでください。
feeling_jumper

2018/08/07 12:45

同じ内容ではないのです。違うことをそれぞれ聞いています。なので、こちらではゲーム内での動きやバグなんかは聞かないようにしていました。javaのソースの読み方について、自分で勉強しただけでは、わかりづらかったため質問させていただいています。。
m.ts10806

2018/08/07 12:52

マインクラフト独自な仕組みなのであればそれもフォーラムで聞くのが確実と思いますよ。もし「初心者」として勉強したいのであればもっと簡単なところから見てかないと余計混乱しますよ。「初心者(本来なら初心者アイコンを活用すること)」と書いてあるだけではどの程度の理解かわかりませんし、正直本当の初学者がいきなり臨める内容ではないと感じました。
feeling_jumper

2018/08/07 12:57

マインクラフト独自の仕組みを知りたくて質問しているのではなく、ソースの読み方などがあれば、ということで聞いたつもりです。混乱するかどうかは本人次第かと思いますし、勉強方法を聞きたいわけではありません。不愉快な質問をしてしまい申し訳ありませんね > <
m.ts10806

2018/08/07 13:05

目的が「マインクラフトのMod開発」でそこからコードを引っ張ってきている以上は文章を多少変えたところで同じですよ。別にここで質問するのをやめろと言うわけではありませんが、お世辞にも賢明とは言えません。あとはお好きにどうぞ。冒頭文で「フォーラムで聞いてよ」と思う人は少なくないと思いますけどね。
feeling_jumper

2018/08/07 13:10

アドバイスありがとうございました^^
guest

回答1

0

ベストアンサー

Javaはちょこっと触っただけ、マインクラフトはゲームの動画を見ただけなので間違っていたらごめんなさい。
汎用的な「ソースコードの読み解き方」の話です。


「クラスやメソッドの機能が分からない時」は、
その機能を作った人(か有志)が書いたドキュメント(説明書)を探しましょう。

「マインクラフト GameRegistry」でググったら以下のページが見つかりました。
GameRegistry - Minecraft Modding Wiki
この中のaddRecipe(ItemStack output, Object... params)の項目には「レシピの追加」とあるので、ひとまず質問主さんの認識で合っているようです。
が、まだ引数の意味は分かりません。

上記ページに「ModLoader.addRecipeと同等」とあるので、今度は「マインクラフト ModLoader.addRecipe」でググってみます。
以下のページがヒットしました(上記と同じサイト内だけど)。
レシピの追加 - Minecraft Modding Wiki
これを見ると、各引数に何を指定すればいいかが分かります。

とりあえずレシピを追加したいだけなら、ここまで分かっていればOKです。


「メソッドの機能(=使い方)」はこれで分かったとして、今度は実働部が何処か見てみます。
とりあえず以下の行まで辿り着きました。

CraftingManager.getInstance().addRecipe(output, params)

.で繋がってようがメソッドはメソッドなので、1つずつ追いかけてみます。
CraftingManager内のgetInstance()メソッドを探します。
public static final CraftingManager getInstance() { return instance; }
ありました。つまりCraftingManager内のinstanceって変数を返してます。

instanceって変数は何者でしょうか?
private static final CraftingManager instance = new CraftingManager();
つまり「生成されたCraftingManagerクラス自身」だそうです。

ということは
CraftingManager.getInstance().addRecipe(output, params)
CraftingManagerのinstanceのaddRecipeメソッド呼び出し
という意味のコードです。

つまり結局呼ばれているのはCraftingManagerのaddRecipeメソッドなんで、次はその中を見ればいいわけです。

こんな風に追いかけられる所まで追いかけて、実際にレシピ作ってるなーという処理の場所を見付けたら、そいつが「レシピを生成するという機能が実装されているクラス」です。
その機能を行う為のオブジェクトとは?と言われたら「レシピを生成するという機能が実装されているクラスのインスタンス」です。
(CraftingManagerの全文が見付からなかったのでふわっとした書き方になってます)

そもそもインスタンスって何?という場合は以下参照。
クラスとインスタンスの違い
図で理解するJavaのクラスとインスタンス

ぶっちゃけこの辺はゲームの根幹から弄りたい人向けだと思うんで、
既存機能を使うだけなら前段の「メソッドの使い方」だけ分かっていればいいと思います。ご参考までに。

投稿2018/08/07 14:27

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

feeling_jumper

2018/08/07 15:26

ありがとうございます!めちゃくちゃわかりやすいです。。 CraftingManagerのaddRecipeメソッドは、私も探したんですが、それがどこなのかがわからないです。 private CraftingManager()の中に、なんども似たようなaddRecipeがでてきていて、 そこには、最初に書いてある GameRegistry.addRecipe(new ItemStack(Items.diamond),"#","#","#",'#',Blocks.dirt); これと似たような記述がたくさん書かれています。 ゲーム内では、何か作る時、作業台と呼ばれているものを使って、 4マスのボックスに任意のアイテムを入れて、何かを作るというものなのですが、 私が想像していたのは、レシピを管理・登録するクラス?に、 ダイヤモンドを作るための新しいレシピとして、 ①「dirt」という素材を使い、 ②「#,#,#」という位置にそれを置くと作れるよ。 という引数?を渡しているはずだと思っていたのですが、 それっぽい記述が見当たらず、 this.addRecipe(new ItemStack(Items.paper, 3), new Object[] {"###", '#', Items.reeds}); このような記述ばかりです。。 CraftingManagerのaddRecipeメソッドが他にあるということでしょうか?
sakura_hana

2018/08/08 02:34

>何度も似たようなaddRecipeが出てくる こいつは「オーバーロード」と言って「引数を変えることで同じ名前のメソッドでも違う振る舞いをする」機能です。詳しくは以下参照。 https://eng-entrance.com/java-method-overload >私が想像していたのは、〜 この推測自体は合ってます。 ですが実際のレシピは、他にも色々な可能性が考えられますよね? 「素材Aをどのマスでもいいので置くと、生成物Xが出て来る」 「素材Aを特定の並び順で置くと、生成物Xが9個出て来る」 「素材A,Bを特定の並び順で置くと、生成物Xが1個出て来る」 「素材A,B,Cを特定の並び順で置くと、生成物Xと素材Aが1個出て来る」 「素材Aを1マスに2つ、素材Bを1マスに1つ、特定の並び順で置くと、生成物Xが1個出て来る」 などなど。 そのバリエーションを受け付ける為に複数のaddRecipeが存在しているのではないかと思います。(このプログラムを作った人の設計思想なので推測形です)
feeling_jumper

2018/08/10 11:24

ありがとうございました!!^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問