【質問】色つき羊毛ブロックを大量に追加する方法

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

【質問】色つき羊毛ブロックを大量に追加する方法

投稿記事by 巫女㌧ » 2012年4月17日(火) 00:01

初めまして、巫女㌧と申します。
初めてトピックを立てさせていただくので、至らない点が多々あるかと思いますが、よろしくお願い致します。

早速本題ですが、
・同一IDで複数ブロックを追加する方法 (Wool 35/Wool 35:1 のようなもの)
・同一テクスチャから各ブロックに割り振る方法 (terrarin.png のように)
を教えていただければと思います。

実際に行いたい内容は、新しく羊毛を追加しようとしていて、全部で256個ほど追加しようとしています(個数は予定なので、激減する場合があります)。
ソースは後述しますが、1ブロック追加する所までしかできておらず、一度に2個以上追加する方法が分からず頭が煮えている状態です…。
次に、複数追加したブロックのテクスチャを1枚ずつ管理するのは大変なため、terrarin.pngのように一枚に収め、それを各ブロックに割り振りたいと考えています。
こちらのフォーラムを始め、様々な日本語の解説サイトを拝見しましたが、どちらの方法も見つけられず、今回このような形で質問させていただきました。

Javaの勉強をしながら作成しているため知識が足りていませんが、皆様のお力をお貸しいただけると助かります。

よろしくお願い致します。

現在編集しているソース
package net.minecraft.src;

public class mod_Blockwools extends BaseMod{

public static Block woolBlock;
public int blockID;
public String fileToOverride;
public String textureFilePath;

public mod_Blockwools()
{
}
public void load()
{
blockID = 125;
fileToOverride = "/terrain.png";
textureFilePath = "/wool/wool.png";
woolBlock = new BlockWools(blockID, ModLoader.addOverride(fileToOverride, textureFilePath));
woolBlock.setHardness(3F);
woolBlock.setBlockName("woolBlock");
woolBlock.setResistance(5F);
woolBlock.setStepSound(Block.soundClothFootstep);
ModLoader.registerBlock(woolBlock);
ModLoader.addName(woolBlock, "wool(White)");
}
public String getVersion()
{
return "1.0.0";
}
}


添付画像は実際に作ろうと計画した直後に作ったテクスチャーになります。
名前はその時から変えていないため、ソース内で呼び出しているものとは違うものになっています。
添付ファイル
color.png
color.png (1.6 KiB) 表示数: 2234 回
最後に編集したユーザー 巫女㌧ [ 2012年4月17日(火) 15:06 ], 累計 1 回
アバター
巫女㌧
ID:25e6dd47
木を殴ってる
 
記事: 33
登録日時: 2012年1月22日(日) 21:17

  • (PostNo.34721)

Re: ブロック追加について質問

投稿記事by lain14 » 2012年4月17日(火) 02:01

・同一IDで複数ブロックを追加する方法 (Wool 35/Wool 35:1 のようなもの)

一般的にはメタデータ(と呼ばれているもの)を使用して同一IDで複数種のブロックがあるように振舞わせます
メタデータは0から15までの値しか保持できないので、1IDあたり16種類のブロックが限界になります
BlockClothクラスやBlockWoodクラス、ItemClothクラスなどのソースコードを参考にしてみてください

同一IDで16種類以上のブロックを実現したい場合はTileEntityクラスを利用します
こちらは変数を好きなだけ保持できるので種類は無制限です
ただしTileEntityを大量に配置した場合、データの読み込みなどでゲームが重たくなる可能性があります
BlockChestクラス、TileEntityChestクラス、などが参考になると思います

同一テクスチャから各ブロックに割り振る方法 (terrarin.png のように)

既存クラスを大幅に変更すればできそうですが、初心者向きではありません
挑戦したい場合はRenderBlocksクラスやTessellatorクラスを覗いてみてください
もしかしたら拡張API(Forgeなど)にはそういった機能を提供するものがあるかもしれません

単純にブロックの色を変えたいだけなら、白いテクスチャを用意して
BlockクラスのcolorMultiplierメソッドをオーバーライドして色を付けるという方法もあります

手前味噌ですが、下記動画の2分25秒以降はこの方法でブロックに色を付けています


ところでトピックのタイトルについてですが、他のフォーラム利用者さんのためにも
「色つき羊毛ブロックを大量に追加する方法」とか「256色表現可能なブロックの作り方」みたいな
質問の核心部分がわかりやすいものにしてみてはいかがでしょうか
アバター
lain14
ID:8725f8a9
木を殴ってる
 
記事: 26
登録日時: 2011年7月09日(土) 20:49

  • (PostNo.34729)

Re: ブロック追加について質問

投稿記事by 邑希鎧斗 » 2012年4月17日(火) 04:42

lain14 さんが書きました:
同一テクスチャから各ブロックに割り振る方法 (terrarin.png のように)

もしかしたら拡張API(Forgeなど)にはそういった機能を提供するものがあるかもしれません

lain14さんの説明の補足としてですが
ModLoader.addOverrideはテクスチャの使用していないところを上書きして使う機能になります。
スプライトID上限は使用済みも入れて512で既に約480を既存で使用されてます。
上限のうち256がブロック専用で残りがアイテム専用になってます。
使用可能な残りは各テクスチャを見てもらえれば大体わかるかと思います。
拡張API(forgeなどのスプライト系)を使用すれば既存で指定されているテクスチャ(terrarin.pngなど)以外からの読み込みに対応するので実質上限はなくなります。
気まぐれで作りたいと思ったMOD作ってます。
詳細は下記にて
邑希商会MOD事業部
アバター
邑希鎧斗
ID:1037ae4a
レッドストーン掘り
 
記事: 528
登録日時: 2011年8月24日(水) 14:12

  • (PostNo.34809)

Re: ブロック追加について質問

投稿記事by 巫女㌧ » 2012年4月17日(火) 23:23

lain14 さんが書きました:
・同一IDで複数ブロックを追加する方法 (Wool 35/Wool 35:1 のようなもの)

一般的にはメタデータ(と呼ばれているもの)を使用して同一IDで複数種のブロックがあるように振舞わせます
メタデータは0から15までの値しか保持できないので、1IDあたり16種類のブロックが限界になります
BlockClothクラスやBlockWoodクラス、ItemClothクラスなどのソースコードを参考にしてみてください

同一IDで16種類以上のブロックを実現したい場合はTileEntityクラスを利用します
こちらは変数を好きなだけ保持できるので種類は無制限です
ただしTileEntityを大量に配置した場合、データの読み込みなどでゲームが重たくなる可能性があります
BlockChestクラス、TileEntityChestクラス、などが参考になると思います

同一テクスチャから各ブロックに割り振る方法 (terrarin.png のように)

既存クラスを大幅に変更すればできそうですが、初心者向きではありません
挑戦したい場合はRenderBlocksクラスやTessellatorクラスを覗いてみてください
もしかしたら拡張API(Forgeなど)にはそういった機能を提供するものがあるかもしれません

単純にブロックの色を変えたいだけなら、白いテクスチャを用意して
BlockクラスのcolorMultiplierメソッドをオーバーライドして色を付けるという方法もあります

手前味噌ですが、下記動画の2分25秒以降はこの方法でブロックに色を付けています


ところでトピックのタイトルについてですが、他のフォーラム利用者さんのためにも
「色つき羊毛ブロックを大量に追加する方法」とか「256色表現可能なブロックの作り方」みたいな
質問の核心部分がわかりやすいものにしてみてはいかがでしょうか


お返事遅くなってしまい申し訳ありませんでした。
アドバイスいただいた通り、トピックの名称を変更させていただきました。

ブロックのメタデータについてアドバイスをいただき、さっそく検索をかけてみたところ、
すでにこちらのフォーラムに自己解決したトピックがあったので、そちらを参考に作ってみました。
http://forum.minecraftuser.jp/viewtopic.php?f=21&t=1203


作成自体は成功し、複数ブロックの追加は成功致しました。
ですが、手持ちのブロックは見た目が違うんですが、ブロックを設置すると全て同じ見た目になってしまいました…

また、テクスチャについてですが、初心者向きではないとのことなので、大人しく個別のテクスチャを使用し、
初心者を抜けられた時(どのタイミングかは分かりませんが…)にまた挑戦してみようと思います。

アドバイス本当にありがとうございました。

添付はの「BlockWools.zip」はModloader対応で、砂を並べると作成できます。
「collorWools_java」はclassファイルに変換する前のJavaが入っています。
添付ファイル
BlockWools.zip
(3.64 KiB) ダウンロード数: 21 回
colorWools_java.zip
(1.23 KiB) ダウンロード数: 33 回
アバター
巫女㌧
ID:25e6dd47
木を殴ってる
 
記事: 33
登録日時: 2012年1月22日(日) 21:17

  • (PostNo.34810)

Re: ブロック追加について質問

投稿記事by 巫女㌧ » 2012年4月17日(火) 23:25

邑希鎧斗 さんが書きました:
lain14 さんが書きました:
同一テクスチャから各ブロックに割り振る方法 (terrarin.png のように)

もしかしたら拡張API(Forgeなど)にはそういった機能を提供するものがあるかもしれません

lain14さんの説明の補足としてですが
ModLoader.addOverrideはテクスチャの使用していないところを上書きして使う機能になります。
スプライトID上限は使用済みも入れて512で既に約480を既存で使用されてます。
上限のうち256がブロック専用で残りがアイテム専用になってます。
使用可能な残りは各テクスチャを見てもらえれば大体わかるかと思います。
拡張API(forgeなどのスプライト系)を使用すれば既存で指定されているテクスチャ(terrarin.pngなど)以外からの読み込みに対応するので実質上限はなくなります。


アドバイスありがとうございます。
なるほど…高度なことをしようと思うとforgeなどが必要になってしまうんですね…
参考にさせていただきます!
アバター
巫女㌧
ID:25e6dd47
木を殴ってる
 
記事: 33
登録日時: 2012年1月22日(日) 21:17

  • (PostNo.34838)

Re: ブロック追加について質問

投稿記事by lain14 » 2012年4月18日(水) 03:01

巫女㌧ さんが書きました:作成自体は成功し、複数ブロックの追加は成功致しました。
ですが、手持ちのブロックは見た目が違うんですが、ブロックを設置すると全て同じ見た目になってしまいました…

バージョンが変わってデコンパイラがつける名前が変わったせいですね
バージョン1.2.5であればItemWools.javaの
コード: 全て選択
public int getPlacedBlockMatadata(int i) {


コード: 全て選択
public int getMetadata(int i) {

に変えてやれば色がつくと思います

せっかくなのでcolorMultiplierとTileEntityを使ったサンプルも置いておきます
染料を持っている状態で右クリックすると段階的に染めることができるブロックを追加するサンプル

mod_UFColorWool.java
コード: 全て選択
package net.minecraft.src;

public class mod_UFColorWool extends BaseMod {

   public static Block colorWool;
   public static int blockID = 125;

   public void load() {

      colorWool = new UFBlockColorWool(blockID, Block.cloth.blockIndexInTexture, Material.cloth)
         .setHardness(0.5F).setStepSound(Block.soundClothFootstep).setBlockName("colorwool");

      ModLoader.registerBlock(colorWool);
      ModLoader.addName(colorWool, "colorWool");

      ModLoader.addRecipe(
         new ItemStack(colorWool, 1, 0),
         new Object[]{"#", Character.valueOf('#'), Block.sand
      });

      // tileEntityの登録
      ModLoader.registerTileEntity(UFTileEntityColorWool.class, "tileentitycolorwool");
   }

   public String getVersion() {
      return "1.0.0 for minecraft 1.2.5";
   }
}


UFBlockColorWool.java
コード: 全て選択
package net.minecraft.src;

public class UFBlockColorWool extends BlockContainer { //Blockの代わりにBlockContainerを指定

   private static final float DYE_STRENGTH = 0.25f; //染料の濃さ

   protected UFBlockColorWool(int par1, int par2, Material par3Material) {
      super(par1, par2, par3Material);
   }

   public TileEntity getBlockEntity() {
      return new UFTileEntityColorWool();
   }

   @Override
   public int colorMultiplier(IBlockAccess par1iBlockAccess, int par2, int par3, int par4) {
      // このブロックのtileEntityを取得する
      UFTileEntityColorWool te = (UFTileEntityColorWool)par1iBlockAccess.getBlockTileEntity(par2, par3, par4);

      if (te == null) return 0xffffff;
      else return te.rgb;
   }

   public boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer) {
      // ブロックが右クリックされた際の処理
      UFTileEntityColorWool te = (UFTileEntityColorWool)world.getBlockTileEntity(i, j, k);
      if (te == null) return false;

      ItemStack itemstack = entityplayer.inventory.getCurrentItem();
      if (itemstack == null) return false;
      if (itemstack.itemID != Item.dyePowder.shiftedIndex) return false;

      int dyecolor = ItemDye.dyeColors[itemstack.getItemDamage()];
      int blockcolor = te.rgb;

      // 染料の色と現在のブロックの色を混ぜあわせて新しい色にする
      te.rgb = alphaBlend(dyecolor, blockcolor, DYE_STRENGTH);

      // ブロックが更新されたことを通知する
      world.markBlockNeedsUpdate(i, j, k);
      return true;
   }

   private int alphaBlend(int src, int dest, float alpha) {
      int sr = (src >>> 16) & 0xff;
      int sg = (src >>> 8) & 0xff;
      int sb = (src >>> 0) & 0xff;

      int dr = (dest >>> 16) & 0xff;
      int dg = (dest >>> 8) & 0xff;
      int db = (dest >>> 0) & 0xff;

      int nr = (int)(sr * alpha + dr * (1 - alpha));
      int ng = (int)(sg * alpha + dg * (1 - alpha));
      int nb = (int)(sb * alpha + db * (1 - alpha));

      return (nr & 0xff) << 16 | (ng & 0xff) << 8 | (nb & 0xff) ;
   }
}


UFTileEntityColorWool.java
コード: 全て選択
package net.minecraft.src;

public class UFTileEntityColorWool extends TileEntity {
   public int rgb; // ブロックの色
   
   public UFTileEntityColorWool () {
      this.rgb = 0xffffff;
   }
   
   public void readFromNBT(NBTTagCompound par1nbtTagCompound) {
      super.readFromNBT(par1nbtTagCompound); // これは必須なので消さないこと

      // セーブデータからrgbを読み出す
      this.rgb = par1nbtTagCompound.getInteger("rgb");
   }
   
   public void writeToNBT(NBTTagCompound par1nbtTagCompound) {
      super.writeToNBT(par1nbtTagCompound); // こっちも

      // セーブデータにrgbを保存する
      par1nbtTagCompound.setInteger("rgb", this.rgb);
   }
}
アバター
lain14
ID:8725f8a9
木を殴ってる
 
記事: 26
登録日時: 2011年7月09日(土) 20:49


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

x