今回はpollBlockHitsという、触ったブロックを検出するプログラムを使って空を飛でみます。まずは、こんなコードを実行してみます。
[python]
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)
[/python]
whileループで繰り返しながら、pollBlockHitsをしています。
このpollBlockHits、利き手に剣を持った状態で、右クリック(ブロックを置くのと同じ操作)すると、そのイベントが記録されます。どんな感じに記録されるかと言うと、
チャットに出力したように、
-93
1
55
7
0
216
こんな感じで記録されます。これは順番に触ったブロックの
- x座標
- y座標
- z座標
- 方向
- イベントタイプ(いつも0)
- エンティティID(今度詳しく)
です。
さて、このpollBlockHitsを使って、何回かに渡って面白いことをやってみましょう。今日は飛んでみます。コードはこんな感じ。
[python]
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()
[/python]
pollBlockHitsのイベントの中身は見ていませんが、イベントがあったか(右クリックしたかどうか)だけをみて、あったら主人公を上に飛ばしています。右クリックしたら飛ぶってことですね。飛んでみると、
おぉー飛んだ。まだまだ飛んだ!
飛びすぎかな~~、あ、落ちた!
あ~あ、死んじゃいました。飛びすぎには注意ですね。着地は水の上がいいかもしれません。
[amazon_link asins='1119269067,3864903734,4800711657,4839960488,479814911X,4800711274' template='ProductCarousel' store='kikushun-22' marketplace='JP' link_id='8fc8bd6a-4ea4-11e7-9891-d399843555be']