作品づくりサポート
【MakeCodeシリーズ⑦】動く空飛ぶ車をつくろう

今回の記事について
以前、こちらのYouTube動画で空飛ぶ車のつくり方をご紹介しました。
今回はMakeCodeで空飛ぶ車を動かしてみましょう!完成すると、以下のように動作します!

今回の記事では、「変数」と「関数」というものをたくさん活用します。これらの使い方を知らない方は、先に別記事「【MakeCodeシリーズ④】変数を活用した建築のやり方」、「【MakeCodeシリーズ⑥】関数の使い方」を読むことをお勧めいたします。
必要なスペース
動く範囲は自分で設定することができますが、前方と上方に余裕がある場所でつくると良いでしょう。後ほど作成するプログラムにおいて、動く距離を解説と全く同じにすると、前方に60ブロック、幅20ブロック、高さ15ブロック程度のスペースを必要とします。
道
道などのサイズやデザインは自由にしていただいて構いません(そもそも道を作成する必要もありません)が、今回私が作成した道のサイズを参考までに記載しておきます。
長さ59ブロック、幅19ブロック、上方15ブロックのスペースを使用しています。端から4ブロック空けたところに、直径11ブロックの円の印をつけました。
※道は全く同じように作成する必要はありません。あくまで参考程度にとどめ、オリジナリティあふれるデザインにぜひ挑戦してみてください!

右側の円の前方より1ブロック空けたところに、空飛ぶ車の前輪が来るように作成すると、車体の中心がちょうど円の中心に合います。

空飛ぶ車のつくり方
まず、以下のYouTube動画を参考にして、空飛ぶ車をつくってみましょう!
空飛ぶ車の保存
後ほど作成するプログラムを動かすと、空飛ぶ車が消えてしまうケースが存在します。その際に、一からつくり直すことは大変なので、ストラクチャーブロックに保存しておきましょう。
そのケースというのは、空飛ぶ車を動かしている最中にCキーを押して、MakeCodeの画面を開いた場合です。空飛ぶ車が消えてしまったり、空中で止まってしまったりするので、気をつけてください。
また、万が一消えてしまった場合でも、ストラクチャーブロックに保存しておけば、すぐに復元して使用することができるので安心してください。
以下でストラクチャーブロックに保存する方法を簡単に解説しますが、詳細は別記事「ストラクチャーブロックの使い方」をご参照ください。
ストラクチャーブロックに保存する方法
空飛ぶ車のサイズは、全長10ブロック、幅17ブロック、高さ5ブロックです。

ストラクチャーブロックは空飛ぶ車の右後ろ角に置きます。

設定は以下のようにします。
ただし、X、Zのサイズはみなさんが空飛ぶ車をつくった向きによって入れ替わるので注意してください。

MakeCodeで空飛ぶ車を動かす
最初の設定
最初の設定から行っていきます。
「ループ」タブにある「最初だけ」というブロックを用意し、以下のような最初だけ実行されるプログラムを作成します。一緒に、「setPosition」という名前の関数を作成します。
解説は以下で行います。

まず、「最初だけ」のブロックを作っていきます。
変数「東西」、「高低」、「南北」は空飛ぶ車のサイズを保存しておくための変数です。
※変数については、別記事「【MakeCodeシリーズ④】変数を活用した建築のやり方」をご参照ください。

Minecraftでは、X軸が東西、Y軸が高低、Z軸が南北を表しています。変数「東西」と変数「南北」の値は、みなさんが空飛ぶ車をつくった向きによって入れ替わるので、ご注意ください。
例えば、下の画像では、左はZ軸方向を向いており、右はX軸方向を向いています。この場合、左は「東西=17」「南北=10」となり、右は「東西=10」「南北=17」となります。
変数「高低」の値は、空飛ぶ車の高さの‘5’としてください。

空飛ぶ車の初期位置を保存しておくために、「p0」という名前の変数を追加してください。
p0の値を空飛ぶ車の右後ろの下角(金ブロックの上)の座標にしたいので、その位置の座標を確認してください。

実際に立って、座標をメモしておきましょう。

ワールドの座標を指定するには、「ポジション」タブにある「ワールド【0】【0】【0】」というブロックを使用します。
1つ目を先ほどメモしたx座標、2つ目を先ほどメモしたy座標、3つ目を先ほどメモしたz座標にしてください。

続いて、「構造物を保存する」というブロックを使用します。「ブロック」タブをクリックし、下の方へスクロールすると「構造物」というカテゴリーがあるので、そちらから持ってくることができます。
「名前」を”flying car”とします。

「範囲の始まり」は空飛ぶ車の右後ろの下角(エメラルドブロックの位置)、「範囲の終わり」は左前の上角(ダイヤブロックの位置)とするのですが、その設定はsetPosition関数を使用して行います。

setPosition関数には、範囲の始まりと終わりの2つの座標をそれぞれ変数「p1」、「p2」として保存する役割があります。
※関数の作成・使用方法は、別記事「【MakeCodeシリーズ⑥】関数の使い方」をご参照ください。

では、作ってみましょう!
作成時、関数名を”setPostion”にして「Position」のパラメーターを追加し、「完了」ボタンをクリックしてください。

続いて、範囲の始まりと終わりを格納する変数p1、p2を追加してください。
p1(範囲の始まり)にpositionの値を格納します。
① 「変数」タブから「変数【】を【0】にする」を取り出して、setPosition関数内に追加してください。
② ①でセットしたブロックを「変数p1を【0】にする」のように、対象をp1にしてください。
③ setPosition関数のパラメーターpositionを右クリックしてください。するとメニューが現れるので、「複製する」をクリックします。複製されたpositionを①でセットしたブロックに、「変数p1をpositionにする」のようにセットします。

p2(範囲の終わり)には、p1からx軸方向に「東西」、y軸方向に「高低」、z軸方向に「南北」だけ移動した座標を格納します。
「ポジション」タブにある「【~【0】~【0】~【0】】+【~【0】~【0】~【0】】」というブロックを使います。
‘+’の前はp1、‘+’の後ろは~東西~高低~南北とします。

setPosition関数はこれで完成です。
それでは、「最初だけ」の中でsetPosition関数を呼び出しましょう。
関数を呼び出すためのブロックを追加し、パラメーターの部分をp0とします。これにより、p1に格納する座標をパラメーターとして、setPosition関数に与えることができます。

setPosition関数でp1、p2の値の設定が完了したら、保存する構造物の範囲の始まりと終わりにセットしましょう。

以上で最初の設定が終わりました!
空飛ぶ車を動かす
ではここからは、空飛ぶ車を動かすためのプログラムをつくっていきましょう!

「チャットコマンド”run”を入力した時」を準備し、以下のようにします。変数「p」は新しく作成してください。
なおpは、今空飛ぶ車がある場所から、1ブロック移動した先の座標を格納しておくための変数です。

続いて、replace関数を作成します。
replace関数は、空飛ぶ車を1ブロックだけ動かすための関数です。具体的には、空飛ぶ車がある場所を空気ブロックに一度置き換えて、空飛ぶ車を1ブロック進んだ先に読み込み、p1、p2の値を移動先の座標に更新する作業を行います。
では、“replace”という名前の関数を作成して、「Position」のパラメーターを追加し、パラメーター名を”positionToMove”としてください。ちなみに、”position to move”は「移動位置」という意味です。

「ブロック」タブにある「ブロックを並べる」というブロックを追加します。
このとき、並べるブロックは空気ブロック、範囲の始まりはp1、範囲の終わりはp2、モードは置き換え(replace)としてください。

続いて、「ブロック」タブをクリックし、下までスクロールした位置にある「構造物」カテゴリーから「構造物を読み込む」というブロックを追加します。
このとき、読み込む構造物の名前は、最初の設定で保存した“flying car“とし、読み込み先には、positionToMoveを複製してセットしてください。

最後にsetPosition関数を呼び出します。パラメーターはpositionToMoveとしてください。

「チャットコマンド”run”を入力した時」の中でreplace関数を呼び出します。パラメーターはpとしてください。

もう1箇所、くりかえし処理の直後でもreplace関数を呼び出します。こちらのパラメーターはp0としてください。こうすることで、動いた後の空飛ぶ車を元の位置に戻すことができます。

では、一度空飛ぶ車を動かしてみましょう!チャット欄に”run”と入力してみてください!

どうでしょうか?うまくいくと、空飛ぶ車が10ブロック上へ移動します。
しかし、今のままでは動きが速すぎるかと思います。そこで、空飛ぶ車を少しゆっくり動かすようにしてみましょう。
「ループ」タブにある「一時停止(ミリ秒)【100】」というブロックを使用します。
「チャットコマンド”run”を入力した時」のくりかえし処理の中のreplace関数呼び出しの直後に追加します。こうすることで、くりかえし処理を100ミリ秒(0.1秒)の間隔を空けて行うことができ、空飛ぶ車がゆっくり動くようになります。もし、もう少し遅く(速く)したければ、一時停止ブロックのパラメーターをお好きなようにいじってみてください。
また、このままでは上昇した空飛ぶ車がすぐに元の位置に戻ってしまいます。そのため、一時停止ブロックをくりかえし処理の外のreplace関数呼び出しの直前にも追加します。こちらのパラメーターは、少し長めの5000ミリ秒(5秒)とします。

では、上昇した空飛ぶ車をもっと動かしてみましょう!
「チャットコマンド”run”を入力した時」の中の「くりかえし10回」を選択して右クリックし、「複製」をクリックします。すると、くりかえしブロックとその中身がまとめてコピーされるので右の画像のようにしてください。
1つ目の繰り返しは上昇、2つ目の繰り返しは前進、3つ目の繰り返しは降下のプログラムです。
それぞれ「変数pをp1 + ~【0】 ~【0】 ~【0】にする」のブロックの数値が変わっているので気をつけてください。なお、右画像の赤枠で囲った部分は、みなさんが空飛ぶ車をつくった向きによって変わります。x軸方向を向いている場合は「~ 1 ~ 0 ~ 0」、z軸方向を向いている場合は「~ 0 ~ 0 ~ 1」としてください。
また、前進する距離を長くしたいので、2つ目のくりかえしだけ回数を40回にしています。


ここで何か気づいたことはないでしょうか?3つのくりかえしの中身は非常に似ていますね。
そうです!関数化することができます。
では、くりかえしの中身をmove関数として独立させましょう。
まずはmove関数を作成し、中身を以下の画像のようにしてください。

しかし、このままではそれぞれのくりかえしで動く向きを変更することができません。
そこで、move関数に新たなパラメーター「shift」を追加し、関数呼び出しの際に動く向きを指定しようと思います。こうすることで、shiftに入れる値を変化させることで、動く向きの変更を可能にします。
ではまず、move関数を右クリックして「関数の編集」をクリックしてください。

Positionのパラメーターを追加してパラメーター名を「shift」とし、「完了」ボタンを押してください。

では、move関数内で「変数pをp1+shiftにする」としてください。
さらに、「チャットコマンド”run”を入力した時」に「呼び出し move」ブロックを3つ追加し、それぞれポジションの「~ 0 ~ 1 ~ 0」、「~ 0 ~ 0 ~ 1」、「~ 0 ~ -1 ~ 0」をパラメーターとして与えてください。
2つ目の「呼び出し move」ブロックは、先ほどと同様にみなさんが空飛ぶ車をつくった向きによって変わるので注意してください。また、前進する距離だけ長いので4回くりかえしてください。

しかしこのままでは、move関数を呼び出した際にどの向きに動くのかわかりづらいので、新たな変数「rise」、「forward」、「descent」を導入します。riseは「上昇」、forwardは「前進」、descentは「降下」という意味です。
「最初だけ」で、rise、forward、descentを「~ 0 ~ 1 ~ 0」、「~ 0 ~ 0 ~ 1」、「~ 0 ~ -1 ~ 0」にしてください。そして、「チャットコマンド”run”を入力した時」の「呼び出し move」ブロックに与えるパラメーターを以下のように変更してください。

ここまでできたら完成です!
MakeCodeで空飛ぶ車に乗車する
乗車モードの追加
ここからは、空飛ぶ車に乗車するオプションを追加していきます。空飛ぶ車に乗って動いてみたいという方は、ぜひこちらの機能も追加してみてください。


まず、乗車位置を確認します。
上の画像で、スティーブが立っている位置に乗車することになります。下の画像では、同じ位置に防具立てを設置しました。見えるように真上の屋根のブロックはどけてあります。
乗車位置は、p1(空飛ぶ車の右後ろの下角、エメラルドブロック)の位置からX軸方向に8ブロック、Z軸方向に7ブロック(空飛ぶ車の向いている方向によっては、X軸方向に7ブロック、Z軸方向に8ブロック)先です。
また、Y軸方向には空飛ぶ車の床の1ブロック分上です。

空飛ぶ車と一緒に、プレイヤーも移動するように設定します。
「プレイヤー」タブにある「~【0】~【0】~【0】にテレポートする」というブロックを使用します。このブロックをsetPosition関数の一番最初に挿入してください.

テレポートブロックの中身を「postion + ~ 8 ~ 1 ~ 7 にテレポートする」(空飛ぶ車の向いている方向によっては、「postion + ~ 7 ~ 1 ~ 8 にテレポートする」)に変更します。

一度実行してみましょう!
空飛ぶ車に乗って移動することができたでしょうか?
では次に、乗車モードをオン/オフ切り替えできる機能を追加します。
「チャットコマンド【”jump”】を入力した時」のブロックを追加し、条件を“ride-on”を入力した時にしてください。

新たな変数「isRideMode」を追加します。
isRideModeは、乗車モードがオンになっているかオフになっているかを格納しておくための変数です。オンの場合は”真”、オフの場合は”偽”となります。ちなみに、このような正しいか正しくないか、YesかNoかなどを判定するものを、プログラミングの世界では「真偽値」と呼びます。
では、「チャットコマンド”ride-on”を入力した時」の中で、isRideModeを“真”にしましょう。
真偽値は、「論理」タブの「論理値」カテゴリーの中にあります。

さらに、乗車モードがオンになったら、チャット欄にメッセージが送信されるようにしましょう。
「プレイヤー」タブにある「メッセージ【”:)”】を送信する」というブロックを追加し、メッセージ内容を“乗車モードがオンになりました”にしてください。

続けて、乗車モードをオフにするブロックも作成します。
「チャットコマンド”ride-on”を入力した時」のプログラムを複製し、以下のようなプログラムを作成してください。

isRideModeが”真”のときだけテレポートするようにしたいので、テレポートの条件を追加します。
「論理」タブの「条件判断」カテゴリーにある「もし【真】なら」のブロックを以下の場所に追加します。

「論理」タブの「くらべる」カテゴリーにある「【0】=【0】」を使用して、条件を以下のように変更します。‘=’の左にはisRIdeMode,右には”真”を追加します。

乗車モードのプログラムはこれで完成です。
それでは、実行してみましょう!
チャット欄に”ride-on”と入力してください。すると、乗車モードがオンになります。

乗車モードがオンの状態で実行すると、空飛ぶ車に乗車したまま移動できます。
また、チャット欄に”ride-off”と入力すると乗車モードがオフになり、降りた状態で空飛ぶ車を移動させることができます。
コマンドを入力したことによる通知を消す
現在は下の画像のように、多くのテレポートの通知が表示されてしまっていると思います。

以下のコマンドをチャット欄に入力することで、コマンドの通知を非表示にすることができます。
☑️ 非表示にするコマンド
/gamerule sendcommandfeedback false
また、以下のコマンドをチャット欄に入力することで、コマンドの通知を再表示させることができます。
☑️ 再表示させるコマンド
/gamerule sendcommandfeedback true
さいごに
以下が完成したプログラムの全体像です。

また、こちらからプログラムを確認することができます。
この記事では動く空飛ぶ車のつくり方をご紹介しましたが、電車のように水平に移動したり、エレベーターのように垂直に移動したりする乗り物にも応用が効くと思います。
またMakeCodeでは、他にも建物の建築をAgentに手伝ってもらったり、さまざまな仕掛けをつくったりすることができます。ぜひ自分でもいろいろ試して、効率良く作品づくりを進めてみてくださいね。
保護者や指導者の方々へ
MakeCodeは、子ども達が視覚的に理解しやすい「ビジュアルプログラミング言語」を採用しています。
MakeCodeでプログラミングに触れて興味が湧き、その後自分自身で言語を学び、もっと複雑なプログラミングに挑戦していく子もいます。
Minecraftカップに参加する中で、お子さんから「もっと早く建物をつくりたい」「プログラミングもやってみたい」といった声が上がりましたら、ぜひ本記事をすすめてみてください。
MakeCodeシリーズ
【MakeCodeシリーズ①】fillコマンドとreplaceコマンド
<執筆:渡邊陽翔>