Scratch2MCPIでMinecraft Piを焼き上げよう

2016年3月9日(水)
薬師寺 国安

最終回の今回は、調理の仕上げとしてScratch2MCPIでMinecraft Piを焼き上げて料理を完成します。具体的には、Minecraft Piの世界に一瞬で塔や壁を創造するプログラミング方法を解説します。通常のScratchとScratch2MCPIの違いは、Minecraft Piの世界を操作できる命令が追加される点です。通常のScratchではMinecraft Piの世界は操作できません!

Scratch2MCPIに追加された命令の一部

はじめに、Minecraft Piを起動してワールドを作成し、その後Scratch2MCPIを起動して両アプリの連携が取れた状態にしてください。前回の「アプリの起動順に注意しよう」の項でも説明したように、起動するには順番があります。順番を間違えるとうまく接続できないので注意してください。
さて、うまくMinecraft Piと接続できれば、Scratch2MCPIの「制御」分類に図1の命令が、また「変数」分類には図2の命令が追加されます。これ以外にも命令を実行すると追加される命令がありますが、こちらは後ほど解説します。

 

これらの命令はドロップダウンリストになっており「▼」をクリックするとほかの命令も表示されます。

塔を作ってみよう

準備ができたら、手はじめに10段の塔を作ってみましょう。Scratch2MCPIで図3のようなプログラムを組み立てます。

順番に説明しましょう。まず「制御」分類にある「スペースキーが押されたとき」をスクリプトエリア内にドラッグ&ドロップします。次に同じ「制御」分類から「getHeightを送る」を「スペースキーが押されたとき」と結合し、「getHeight」の「▼」アイコンをクリックして「reset」を選択します。これで、スペースキーを押すとMinecraft Piの世界がリセットされて大草原だけが広がる景色になります(図4)。通常Minecraft Piの世界には木々や海、岩などが存在していますが、その状態で「塔」を創造しても場所がわかりにくいので、一度Minecraft Piの世界をリセットしておくのです。

続けて「制御」分類から「緑色の旗がクリックされたとき」をドラッグ&ドロップし、その下に「変数」分類から「blockDataを0にする」を4個組み合わせます。「blockData」の「▼」アイコンをクリックして、上から「mcpiX」、「mcpiY」、「mcpiZ」を「0にする」と指定します。これは「Minecraft PiのX、Y、Z軸を0で初期化する」という意味です。最後の「bloackData」には「blockTypeId」を選択しましょう。これは、積み上げるブロックの種類を数値で指定するものです。blockTypeIdに指定する値とその種類は表1のようになります。ここでは「1」を指定したので「石の塔」が積み上げられます。

表1:blockTypeIdに指定する値
【参考URL: http://www.stuffaboutcode.com/p/minecraft-api-reference.html(英文)】

bkockTypeIdブロックの種類
0空気
1
2
3
4丸石
5木材
6苗木
7岩盤
8
9静止した水
10溶岩
11静止した溶岩
12
13砂利
14金鉱石
15鉄鉱石
16石炭鉱石
17原木
18
20ガラス
21ラピスラズリ鉱石
22ラピスラズリブロック
24砂岩
26ベッド
30蜘蛛の巣
31
35羊毛
37黄色の花
38バラ
39キノコ(茶)
40キノコ(赤)
41金ブロック
42鉄ブロック
43重ねたストーンスラブ
44ストーンスラブ
45レンガブロック
46TNT
47本棚
48苔石
49黒曜石
50松明
51
53樫の木の階段
54チェスト
56ダイヤモンド鉱石
57ダイヤモンドブロック
58作業台
60耕地
61かまど
62燃えているかまど
64木のドア
65梯子
67丸石の階段
71鉄のドア
73レッドストーン鉱石
78
79
80雪のブロック
81サボテン
82粘土ブロック
83サトウキビ
85フェンス
89グローストーンブロック
95鍵のかかったチェスト
98石レンガ
102板ガラス
103メロン
107フェンスゲート
246輝く黒曜石
247ネザーリアクターコア

これで石の塔を積み上げる準備ができたので、今度は石を10段積み上げる命令を追加していきます。「制御」分類から「10回繰り返す」をドラッグ&ドロップして「緑色の旗がクリックされたとき」に結合し、さらに「10回繰り返す」命令に「制御」分類から「getHeightを送る」をドラッグ&ドロップして結合します。「getHeight」の「▼」をクリックして「setBlock」を選択しましょう。これで「10個のブロックをセットする」という意味になります。

次に、10個のブロックを積み上げる時間を指定します。「制御」分類から「1秒待つ」をドラッグ&ドロップして「setBlockを送る」に結合し、「1」を「0.1」に書き換えます。これでブロックを積み上げる時間が「0.1秒」になります。

さらにブロックを10段積み上げるわけですから、Minecraft PiのY軸の値を増やしていく必要があります。そこで、最後に「変数」分類から「blockDataを1ずつ変える」をドラッグ&ドロップして「0.1秒待つ」に結合し、「blockData」を「mcpiY」にします。これで、Y座標の値が1ずつ変化していくことになります。これで、石の10個のブロックが上方向に積み上げられて塔が作成されます(図5)。

実行すると、Minecraft Piの画面が真っ暗になりますが、これは作成された塔が目の前にあるため暗く表示されているだけです。マウスカーソルのフォーカスをMinecraft Piに移して(Minecraft Piの画面上でマウスを右クリック)、キーボードの[S]キーで後ろに下がれば、塔を見ることができます。

10段の塔を順番に消してみよう

今度は塔を消してみましょう。やり方は非常に簡単です。図3のblockTypeIdを「0」にするだけで下から順番に消えていきます。blockTypeIdを「0」にするのは表1で見ると空気を指定したことになるため、ブロックは無色透明になります。それで塔が消えていくのです(図6)。

壁を作ってみよう

次に壁を作ってみましょう。縦10個×横10個の計100個のブロックを使って壁を創造します。この壁は、言い方を変えれば「10段の塔が横(X軸)に10列並んだもの」と考えることができます。この考え方でプログラムを組み立てると図7のようになります。

ほとんど図3の「10段の塔を作る」プログラムと同じですが、今回は壁の種類を指定するblockTypeIdに「14」(金鉱石)を指定しています。2つあるうちの内側の「10回繰り返す」は図3の「10段の塔を作る」と同じで、Y軸(上方向)に10段の塔を作ります。この10段の塔をX軸(横方向)に並べれば壁ができるわけですから、外側にも「10回繰り返す」を持ってきて、内側の「10回繰り返す」を囲みます。そして横方向に塔を作るため「blockDataの値を1ずつ変える」のblockDataを「mcpiX」にします。これで、横方向にも塔が作られて壁が完成!……といきたいところですが、これではまだ完成しません。外側の「10回繰り返す」の下に「変数」分類から「blockDataを0にする」をドラッグ&ドロップし、blockDataを「mcpiY」に変えます。これでやっと10×10の壁が作成されます(図8)。

なぜ、「mcpiYの値を0にする」を持ってくる必要があるのでしょうか? 上方向に10段の塔が作られるときmcpiYの値は1ずつ変化し、10段の塔が作成されるとX軸方向へ1ずれて、ずれた位置からまた10段の塔が作成されます。このままでは10段積み上げてX軸方向に1ずれて、また10段積み上げて……という処理が10回繰り返されるため壁にならないのです(図9)。したがって、上方向に10段ブロックが積み上げられた後はmcpiYの値を0にして、上方向に積み上げられないようにする必要があるのです。

壁を叩いた位置のブロックを消す

先ほどはプログラム的に壁を消していきましたが、今度は物理的に壁を叩いてブロックを消す方法を試してみましょう。まず「どのブロックが叩かれたのか」という情報として、叩かれたブロックのX、Y、Z座標を取得する必要があります。そのためには、「調べる」分類の「スライダーセンサーの値」を使用して新しく命令するのですが、「スライダー」の横にある「▼」をクリックしても使用できそうなイベントを取得する命令は出てきません(図10)。

スライダーにイベントの命令を追加するには、事前にやっておくことがあります。「制御」分類にある「setBlockを送る」をドラッグ&ドロップして「緑色の旗がクリックされたとき」に結合し、setBlockの「▼」をクリックして「pollBlockHits」を選択します(図11)。pollBlockHitsは「ブロックがヒットされたとき」の情報を返す命令です。図11のスクリプトを1回実行すると、スライダーに命令が追加されます(図12)。

では、このイベントを使って叩いた壁のブロックを消してみましょう。スクリプトは図13のようになります。

なお、図13のスクリプトを実行する前には、すでに図7のスクリプトで10×10の壁が創造されているものとします。「制御」分類から「ずっと」をドラッグ&ドロップし、その中に「制御」分類の「getHeightを送る」と「pollBlockHitsを送る」をドラッグ&ドロップして結合します。これで、ブロックが叩かれたときの情報を常時監視できるようになります。

次に「変数」ブロックから「blockDataを0にする」を4個配置します。最初の3個のblockDataは「▼」をクリックしてmcpiX、mcpiY、mcpiZを選択します。「0」の位置には「調べる」分類から「スライダーセンサーの値」を入れ込みます。「スライダー」の「▼」をクリックして、上からblockEventX、blockEventY、blockEventZを指定しましょう。これで、ヒットされたブロックのX、Y、Z座標が取得できます。

4個目の「blockDataを0にする」には、ブロックの種類をblockTypeIdから選択して「0」にしておきます。「0」は空気なので「叩かれたブロックが消える」ことになります。最後に「制御」分類から「1秒待つ」を結合しましょう。今回は「ずっと」処理が行われるため「0.1秒」にすると負荷がかかります。

実行すると、剣で叩いたブロックが1秒後に消えます(図14)。ブロックを叩く場合は必ずマウスを右クリックします。左クリックで叩くと破壊されるので注意してください。また、キーボードでブロックの前まで進んでから叩いてください。

今回で最終回です。本連載では、下ごしらえの環境構築からScratchによるさまざまな味付けプログラミング、メインディッシュのScratch2MCPIでMinecraft Piを操作する連携プログラミングを解説しました。高価なPCを用意しなくても、たった5ドルのRaspberry Pi Zero上でプログラミングが経験できるのはすごいことです。安い素材でも工夫を凝らせばおいしい料理が作れるのと同じですね。

本連載をきっかけに、皆さんもRaspberry Pi Zeroにおけるプログラミングに挑戦してみてはいかがでしょうか。ぜひ、皆さんなりのさまざま味付けに挑戦してみてください。5週間の駆け足連載でしたが、最後までお付き合いいただき、ありがとうございました!

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています