United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

Raspberry PiでMinecraft! プログラミング応用編

Raspberry PiでMinecraft! プログラミング基礎編の続きになります。

前回の記事では主に簡単なブロック配置についてご紹介しました。今回の記事ではプレイヤーの位置変更やプレイヤー基準での様々なプログラミングについてご紹介します。

まずは簡単なものから始めましょう。プレイヤーの現在地座標を取得するコードです。
pos = mc.player.getTilePos()
mc.postToChat(str(pos))

一行目のコードで現在地座標を取得し、二行目のコードで表示します。座標自体は画面左上に常時表示されていますが、イベントなどを自作する場合、重要になるコードです。

次はプレイヤーの周辺にブロックを配置するコードです。
pos = mc.player.getTilePos()
mc.setBlock(pos.x + 1, pos.y + 1, pos.z, block.STONE)

一行目は先ほどの現在地座標を取得するコードです。二行目はプログラミング基礎編でご紹介したブロックを配置するコードです。()の中を見ていただければわかるかと思いますが、自分の座標のx座標とy座標に1を加え、その場所に石ブロックを配置しています。下のコードでも同じ動作をさせることができます。
xpos,ypos,zpos = mc.player.getTilePos()
mc.setBlock(xpos+1, ypos+1, zpos, block.STONE)

次はスタート地点を定め、その座標からプレイヤーまでの距離を表示するプログラムです。
import math
def getDistanceBetweenPoints(point1, point2):
   xDistance = point2.x - point1.x
   yDistance = point2.y - point1.y
   zDistance = point2.z - point1.z
return math.sqrt((xDistance * xDistance) + (yDistance * yDistance) + (zDistance * zDistance))

startPos = minecraft.Vec3(0,0,0)
playerPos = mc.player.getPos()
distanceFromStart = getDistanceBetweenPoints(startPos, playerPos)
mc.postToChat("Distance " + str(int(distanceFromStart)))

7行目の()内の数字を変更することで目的地にすることができます。距離を常時表示させたい場合はループ構文を用いる必要があります。以下のようになります。
import minecraft
import block
import math
import time

#2点間の距離を取得
def getDistanceBetweenPoints(point1, point2):
xDistance = point2.x - point1.x
yDistance = point2.y - point1.y
zDistance = point2.z - point1.z
return math.sqrt((xDistance * xDistance) + (yDistance * yDistance) + (zDistance * zDistance))

mc = minecraft.Minecraft.create()

#スタート地点を取得
startPos = minecraft.Vec3(0,0,0)

while(True):
#プレイヤーの位置を取得
playerPos = mc.player.getPos()

#スタート地点からの距離を計算
distanceFromStart = getDistanceBetweenPoints(startPos, playerPos)

#チャット欄に距離を表示
mc.postToChat("Distance: " + str(int(distanceFromStart)) + " blocks")

#待機時間(待機時間がないと動作が重くなったりゲームが落ちたりします)
time.sleep(1)

最後にrandamコマンドについてご紹介します。宝探しゲームなどを作成するのに必要となるかと思います。
import random
randomNumber = random.randrange(-100, 100)
mc.setblock(randomNumber.x ,randomNumber.y ,randomNumber.z ,block.GOLD_BLOCK)

これで-100から100の座標内にランダムに金を配置することができます。複数配置したい場合はループ構文を使いましょう。

以上となります。今回ご紹介したコード以外にも様々なものがありますので、ぜひ色々試してみてください。サンプルをいくつか下に記しておきます。

カメラ
mc.camera.setNormal([entityId])
mc.camera.setFixed()
mc.camera.setFollow([entityId])
mc.camera.setPos(x, y, z)

自キャラ
mc.player.getPos() => Vec3
mc.player.setPos(xf, yf, zf)
mc.player.getTilePos() => x, y, z
mc.player.setTilePos(x, y, z)

World
mc.getBlock(x,y,z) --> blockTypeId
mc.getBlockWithData(*args):
mc.getBlocks(*args):
mc.setBlock(x, y, z, blockTypeId)
mc.setBlock(x, y, z, blockTypeId, blockData)
mc.setBlocks(x1, y1, z1, x2, y2, z2, blockTypeId)
mc.setBlocks(x1, y1, z1, x2, y2, z2, blockTypeId, blockData)
mc.getHeight(x, z) --> Integer
mc.getPlayerEntityIds() -- >id:int
mc.saveCheckpoint()
mc.restoreCheckpoint()
mc.postToChat(msg)
mc.setting(setting, status)

Events
mc.events.clearAll()
mc.events.pollBlockHits()

DesignSparkの日本語サイト公式アカウントです。DesignSparkシリーズのソフト、PCB Part library、技術記事などサイト上の全サービスの管理を行っています。