今回はpollBlockHitsという、触ったブロックを検出するプログラムを使って空を飛でみます。まずは、こんなコードを実行してみます。
import mcpi.minecraft as minecraft import time mc = minecraft.Minecraft() while True: hits = mc.events.pollBlockHits() if hits: for h in hits: mc.postToChat(h.pos.x) mc.postToChat(h.pos.y) mc.postToChat(h.pos.z) mc.postToChat(h.face) mc.postToChat(h.type) mc.postToChat(h.entityId) time.sleep(0.1)
whileループで繰り返しながら、pollBlockHitsをしています。
このpollBlockHits、利き手に剣を持った状態で、右クリック(ブロックを置くのと同じ操作)すると、そのイベントが記録されます。どんな感じに記録されるかと言うと、
チャットに出力したように、
-93
1
55
7
0
216
こんな感じで記録されます。これは順番に触ったブロックの
- x座標
- y座標
- z座標
- 方向
- イベントタイプ(いつも0)
- エンティティID(今度詳しく)
です。
さて、このpollBlockHitsを使って、何回かに渡って面白いことをやってみましょう。今日は飛んでみます。コードはこんな感じ。
import mcpi.minecraft as minecraft import time import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def fly(): while True: if len(mc.events.pollBlockHits()): mc.player.setPos(mc.player.getPos() + Vec3(0,3,0)) time.sleep(0.1) fly()
pollBlockHitsのイベントの中身は見ていませんが、イベントがあったか(右クリックしたかどうか)だけをみて、あったら主人公を上に飛ばしています。右クリックしたら飛ぶってことですね。飛んでみると、
おぉー飛んだ。まだまだ飛んだ!
飛びすぎかな~~、あ、落ちた!
あ~あ、死んじゃいました。飛びすぎには注意ですね。着地は水の上がいいかもしれません。