マイクラプログラミングの命運をわける戦い。
これを使いこなせる者は、マイクラ戦争でもリーダー的存在になれる伝説の武器。
その名も「スコアボードコマンド」!!
今日はそのスコアボードコマンドで「タイマー機能」の作り方を解説していきます!
スコアボードはプログラミングでいうところの変数
変数ってなんぞや!という声が聞こえてきそうですね。
簡単に言うと、「数字を保存しておくための入れ物」です!
例えば、「残り残機数:3」のように、この人はあと3の残機を持っているよ、というのを覚えておきたいときに「残機」という名前をつけたスコアボードを用意して、そこに「3」を入れておくことができるんです。
そしてスコアボード(入れ物)には、必ず名前をつける必要があります。
例えばプレーヤーの残り残機数を管理するスコアボードを作りたい時、そのスコアボード(入れ物)の名前を zanki というようにアルファベットで付けてあげます。
そしてそのプレーヤーが死んだ時、「zanki」スコアボードに入っている「3」から1を引く、という処理ができます。
するとそのプレーヤーの残機数は「2」というように管理ができるようになるんですね。
このように、スコアボードという入れ物に入れた数字がどんどん変わっていくことを想定しているので、変わる数と書いて変数と呼びます。
タイマーを作る手順
それでは実際にタイマーを作ってみましょう!
1.タイマー(時間)を入れるスコアボードをつくる
まずタイマー(時間)を入れるための入れ物(スコアボード)を作ります。
その入れ物(スコアボード)の名前を timer とつけましょう。
スコアボードを作るコマンドはこれ
/scoreboard objectives add timer dummy
そしてスコアボードを表示する設定もしておきましょう。
/scoreboard objectives setdisplay sidebar timer
画面の横に timer スコアボードが表示されれば成功です。
2.timerを防具立てに渡す
マイクラで作ったスコアボードは、必ず誰かに持っていてもらわないといけないというルールがあります。
そしてスコアボードはプレイヤーだけではなくエンティティにも持っていてもらうことができます。
そこで「防具立て」にtimer スコアボードを持っていてもらいましょう!
/summon armor_stand
/scoreboard players set @e[type=armor_stand] timer 200
こうすることで防具立てさんにtimerを持ってもらい、そのtimerスコアボードの中に200という数字を入れました。
画面の右端にこのように表示されていれば成功です。
200の横に何やら数字が並んでいますが、これは防具立てさんの名前です^^;
実はこれをもっとわかり易い名前にすることもできるのですが、それをするにはかなり複雑なコマンドを実行しなければいけません。
今日はまず簡単にタイマーを作ってしまいたいので、このままいきたいと思います。
3.timerを減らす処理
いよいよタイマー機能に入ります!
/scoreboard players remove @e[type=armor_stand] timer 1
防具立てが持っているtimerから1を引く、という命令文です。
これを反復コマンドブロックに登録して、レッドストーン信号を送りましょう。
反復コマンドブロックが正常に動けば、画面右に表示されていたtimerがどんどん減っていきます。
画面の右上に「-19142952 の timer から 1 を除きました」の表示が出て煩わしいので下記のコマンドを実行しておきましょう。
/gamerule commandblockoutput false
4.timerを0でストップさせる
このままだとtimerの値がずっと減り続けてマイナスになってしまうので気持ち悪いですよね。
4と似た方法で、タイマーが0以上のときだけtimerを減らす、という処理を加えてあげます。
反復コマンドブロックの常にアクティブでこう書きます。
/testfor @e[type=armor_stand,scores={timer=2..}]
2.. と書くのがポイントです。こう書くと「2以上の場合」という意味になります。
このコマンドブロックの次に、3で書いたtimerを1減らすコマンドを条件付きの反復コマンドブロックで繋げてあげましょう。
/scoreboard players remove @e[type=armor_stand] timer 1
こうすることで、「timerが2以上の時にだけ、timerから1減らし続ける」という処理の完成です。
timerが1や0の時ではなく2以上の時にだけ1減らし続けるとしているのは、実際にtimerが1や0になった時に判定していると時既に遅し、判断している間にtimerがマイナスになってしまうからです。
5.timerが0(設定上は1)になったらタイトルを出す
いよいよタイマーらしく、timerが0になったら画面に「ゲーム終了!」と表示する処理を作っていきましょう。
/testfor @e[type=armor_stand,scores={timer=1}]
これを反復コマンドブロックの常にアクティブで動作させます。
実はtimerが0の時、という判定を行いたいですが、timer=0としてしまうとtimerが0の間ずーっと何回もこのコマンドブロックが実行されてしまいます。
ですのでtimer=1になった時だけ実行するのがポイントです。
あとはこの反復コマンドブロックに、「条件付き」のチェーンコマンドブロックを繋げて
/title @a title ゲーム終了
としてあげればOK。
実際のゲーム作成ではこのあとにチェーンコマンドブロックでTPしたりなどのゲーム終了処理を繋げていくことになります。
番外編:タイマー表示をもっと綺麗にしたい
これでタイマーが完成しましたが、画面の右端に-1933672などの数字が表示されてしまうのがやっぱり気になる・・・という人も居ますよね。
そこで、解説はしませんがtitlerawコマンドを使ってアクションバーにスコアボードを表示するコマンドを記しておきます。
/titleraw @a actionbar {"rawtext":[{"text":"残り時間:"},{"score":{"name":"@e","objective":"timer"}}]}
timerというスコアボード名で作った人はこのコマンドがそのまま使えます。
もしtimer以外のスコアボードで作った場合は、このコマンドの最後の方にある timer の部分を自分が作ったスコアボード名に変更してくださいね。
最後に、これを反復コマンドで実行し続ければ完成です。
セクションも使うことができるので、色を付けて見やすくするといいですね。