スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

マイクラmodを作ってみよう#9

こんにちは。

続きをやります。

ItemクラスにonUpdate()があったのでオーバーライドします。
ツルハシを右クリックしたら、ブロックの座標を覚えてフラグを立てます。
onUpdate()メソッドでフラグが立っていたら座標の上に丸石を置きます。
次に呼ばれたら、前回丸石を置いた座標のさらに上に置いていきます。
128回置いたらフラグを落とします。
これで、右クリックしたブロックの上に128個の丸石を自動的に積み上げることができました。

でも、積み上げる速度が速すぎます。
カウンタを持って10回に1回処理するようにしたら、1秒間に6個ずつ積みあがるようになりました。
onUpdate()メソッドは1/60秒に1回起動されるようです。
DirectXと同じで画面の描画周期(fps)で呼ばれる関数ですね。

音が出ないと寂しいので、ちょっと調べてみました。
シャベルの右クリックに音を出す処理があります。
ブロックを地面に配置する音はどれかな。。。

色々試したらこれっぽいです。

worldIn.playSound(player, pos, SoundEvents.ENTITY_ITEMFRAME_ADD_ITEM, SoundCategory.BLOCKS, 1.0F, 1.0F);


配置するブロックの位置でposを更新したら、遠くなるほど音が小さくなるように実装できました。

配置するブロックの上に乗って、エレベーターみたいに上がれないかな。
BlockPos pPos = new BlockPos((int)Math.floor(player.posX), (int)Math.floor(player.posY), 
(int)Math.floor(player.posZ));
if (pos.equals(pPos)) {
player.setPositionAndUpdate(player.posX, player.posY + 1.0F, player.posZ);
}
こんな感じにしたら、ブロックの上に乗って登れるようになりました。

20170211-1.png

でも、登り切った後で再度ツルハシを右クリックすると落ちちゃいます。なぜかな。。。

一秒間の6回だと処理が追い付かないのかもしれないな。
う~ん。色々試してみましたが、onUpdate()で処理するとかなり不安定になるみたいです。
パケットとか使うと安定するのかな?

それでは、また。
スポンサーサイト
[ 2017/02/11 21:00 ] プログラミング | TB(0) | CM(0)

マイクラmodを作ってみよう#8

こんばんは。

ちょっと閃いたので、続きをやります。
今まで上から下に処理してたので、下の丸石が無い状態でレールを敷いたり、レールを敷いた後で下の丸石を置いたりすることになっていました。
これを下から上に処理するようにしてみます。
おお、ちゃんとレールが敷けました。

でも、Z方向の時だけレールが大量にドロップします。
あっ、三重ループをX,Y,Zの順にしていましたが、横方向もブロックを置く順番が関係しているのかな?
試しに高さを一番外側のループにして、レールを伸ばす方向を二番目、幅方向を一番内側のループにしてやってみます。

おお、今度はレールがドロップされなくなりました。
でも、なぜドロップされなくなったのかが良くわからないです。。。
もしかしたら、ForgeかMinecraftのバグかな?
斜面にレールを敷くアルゴリズムの関係かもしれません。

とりあえず、255ブロックの長さのレールを自動で敷いて、トロッコで移動できました。
海もあり、山もあり、トンネルもあり、いい景色が見れました。

20170210-1.png

でも、トロッコって遅いですね。
もっと早いトロッコを作ってみようかな。

あと、一瞬でレールを敷くよりも、音をつけてながら手前から遠くまで少しずつレールを敷いた方が雰囲気が出そうですね。
今回はツルハシの右クリックイベントの中で全ての処理をやってますが、周期的に動いているイベントに処理を入れれば実現できそうです。
もしかしたらonUpdate()メソッドとかが使えるのかもしれません。
これができれば、256×256×256の穴を鉱石をドロップさせながら自動で掘ったりもできるかも。
次回はそんな感じのこともやってみようと思います。

それでは、また。
[ 2017/02/11 00:05 ] プログラミング | TB(0) | CM(0)

マイクラmodを作ってみよう#7

こんばんは。

今日は平日ですが続きをやります。
一時間くらいでなんとかなるかな。

まずは、幅3、高さ3、長さ32のトンネルを作って地面に丸石を置いてみます。
できました。

う~ん。レールがX方向には敷設できるのにZ方向には敷設できない。。。
それとX方向に敷設するとレールの余りがドロップしてしまいます。。。
Y座標を一段下げて丸石の下に敷設するとX方向もZ方向もうまくいきます。
何が悪いのかな。。。

やっぱり平日にしかも酒を飲んだ状態でプログラミングするのは無理があります。
とりあえず今日は寝ます。

それでは、また。
[ 2017/02/07 01:39 ] プログラミング | TB(0) | CM(0)

マイクラmodを作ってみよう#6

こんにちは。

今度は道路と線路を敷設してみます。

オリハルコンのツルハシは残しておきたいので、お試し用にオリハルコンのシャベルを作ります。

うっ、ItemShovelクラスが無い。。。
ItemSpadeみたい。

できた。とりあえずオリハルコンのツルハシと同じ動きになりました。

では、ブロックを配置する方法を調べます。
ブロックを消すときにsetBlockToAir()という空気ブロックに置き換えるメソッドを使っていたので、これと同じで好きなブロックに置き換えられるんじゃないかな。
SetBlockToAir()の中身はこんな感じになっています。

return this.setBlockState(pos, Blocks.AIR.getDefaultState(), 3);


とりあえず、穴を掘る変わりに丸石に置き換えてみます。

おお、できました。
でも、シャベルで掘った1ブロックだけは無くなってます。
デバッガーで追ってみたら、PlayerControllerMクラスからonBlockDestroyed()を読んだ後にBlock.removedByPlaye()rが呼ばれて、この中でsetBlockState()を呼んでました。
パケットとか使えば何とかなりそうな気もしますが面倒です。。。

とりあえず右クリックで敷設できないかやってみます。
おっと、ショベルを右クリックすると草が枯れる機能があるみたいですね。。。

オリハルコンのツルハシで右クリックした時に動くようにonItemUse()をオーバーライドしました。
これで、右クリックで丸石を敷き詰める動きになりました。
でも、右クリックには音が無いんですよね。。。

次は音を出すところからですね。
そのあと、石畳の道路の上に線路を敷設してみます。
障害物があったら穴をあけてトンネルを作るようにしようかな。
3×3×3の穴掘りに加えて丸石の配置と線路の配置をすれば、簡単に線路やトンネルが作れるようになるかな。

それでは、また。
[ 2017/02/05 23:52 ] プログラミング | TB(0) | CM(0)

マイクラmodを作ってみよう#5

こんにちは。

さて、マイクラの世界に干渉するような、すごいmodを作ってみます。

簡単なサンプルだけの情報で全体を理解するのは不可能なので、もう少しまともな情報を探します。

まずは、これを読んでみます。
Forge Documentation

英語は分からないのでGoogle翻訳を使います。
う~ん。日本語になってないな。。。

ソースを解析します。
Block.classを見て、ブロックを消すコードを探してみます。

public void onBlockExploded(World world, BlockPos pos, Explosion explosion)
{
world.setBlockToAir(pos);
onBlockDestroyedByExplosion(world, pos, explosion);
}

こんなのがありますね。

その先を見ると、

public boolean setBlockToAir(BlockPos pos)
{
return this.setBlockState(pos, Blocks.AIR.getDefaultState(), 3);
}

こんな感じになってます。
ということは、Worldで座標を指定してAIRと置き換えれば、ブロックを消せるということですかね?
ちなみに、Worldにはこんなのもあります。

public boolean destroyBlock(BlockPos pos, boolean dropBlock)

こっちだとドロップしてくれるのかも。

とりあえず試してみます。
オリハルコンのつるはしを作って、広範囲にブロックが消せるかやってみます。

前回のオリハルコンの剣はItemSwordクラスのインスタンスとして実装しましたが、今回はItemPickaxeを継承して作って、ブロックを壊したときのイベントとして広範囲のブロックを消してみます。

まずは、TestMod1と同列にOrihalconPickaxeクラスを作ります。
できた。
でも、黒曜石を掘る速度はダイヤのつるはしと変わりません。素材のダメージは関係ないのかな。。。

さて、次はブロック破壊のイベントをオーバーライドします。

onBlockDestryed()をオーバーライドして、posのx、zの±1の座標に対してworldIn.setBlockToAir()を呼んでみたところ、破壊したブロックの回りのブロックが消えました。
でも、ブロックが消えるだけでドロップしてくれませんね。
では、setBlockToAir()の代わりにdestroyBlock()を呼んでみます。

おお、ちゃんとドロップします。
範囲内に木があれば、木もドロップしてくれました。

では、もっと広範囲に掘ってみます。
あっ、掘った瞬間に自分が落ちて死んでしまいますね。。。
自分の座標を求めるにはどうするのかな?
ありました。

Entity player = Minecraft.getMinecraft().thePlayer;

これでposX,posY,posZに座標が入っているみたいです。
ただ、この座標はdouble型でブロックの座標はint型なので、四捨五入しないとずれるみたいです。
四捨五入の関数はMath.floor()ですね。

自分が立ってるところ以外を3×3×3ブロック掘ることができました。
調子に乗って31×31×31ブロックを1回で掘ろうとしたら固まってしまいました。
ドロップが多すぎてOpenGLが処理しきれなくなったのかな。。。

やっぱりそうみたいです。
setBlockToAir()にしてみたら、ちょっと時間はかかりますが127×127×127でもちゃんと動きました。
でも、岩盤まで掘れてしまい、飛び降りたら奈落に落ちてしまいました。(^^;

岩盤は掘らないようにしたいな。

if (worldIn.getBlockState(pos).getBlock() != Blocks.BEDROCK) {

これで、岩盤は掘らないようにできました。

こんな感じです。
20170205-1.png

テストのために掘りまくったら、この世界は穴だらけになってしまいました。(^^;

もうちょっと範囲を狭くして、地面よりも上を掘れるようにしたりすると、岩山の中の部屋とかが簡単に作れそうですね。

5×5の範囲にして、自分よりも下を掘るときは高さ3、自分よりも上を掘るときは高さ5で掘れるようにしました。
これだと真下を掘って自分が落ちてもダメージを受けません。
あと、真下、真上以外の場合は、クリックしたブロックから自分と反対方向に5×5ブロックを掘るようにしました。

このくらいだとドロップさせても遅くならないので、結構使える道具になりました。
20170205-2.png

ブロックを削除する方法は分かったので、次はブロックを追加する方法を調べて道路や線路を自動的に敷けるようにしようかな。

それでは、また。
[ 2017/02/05 20:34 ] プログラミング | TB(0) | CM(0)








上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。