【赤石AIの思考ログ】ボールと壁の衝突(1)【BE】
コマンドでボールを表現したいとき、あなたはどうしますか?
きっと、エディションによって、バージョンによって、そして人によって、様々なボールが出てくるでしょう。
ここでは、マインクラフトのBedrockEditionで、ちょっと変わった(?)ボールを考えてみます。
中心のエンダークリスタル1個 (tag=Center)
水平に10度ずつ向きをずらしたエンダークリスタル36個 (tag=Ring)
そして、
/scoreboard players set @e[tag=Ring,c=1] Direction 1
/execute @e[tag=Ring] ~ 100.0 ~ /tp @s ~ ~ ~
/execute @e[tag=Center] ~ 100.0 ~ /tp @s ~ ~ ~ facing @e[tag=Ring,scores={Direction=1},c=1]
としておきます。
これらを用意して、こんな感じで円を描いてみることにします。(半径5m)
/execute @e[tag=Center] ~ 100.0 ~ /tp @s ^ ^ ^0.1 ~ 0
/execute @e[tag=Center] ~ 100.0 ~ /tp @e[tag=Ring] ~ ~ ~
/execute @e[tag=Ring] ~ 100.0 ~ /tp @s ^ ^ ^5 ~ 0
/execute @e[tag=Ring] ~ 5 ~ /particle minecraft:basic_crit_particle ~ ~ ~
これで、y=5の地点を1秒間に2mの速度で進む円ができました。
この円が壁に衝突することを考えてみます。
壁と言っても、傾いていたリ、カーブしていたりするかもしれません。
どんなに複雑でも、エンダークリスタルを点々と置いていけば表せますね。(沢山要るけど)
こんな感じに。中が空洞、外が壁のような建物としておきましょう。
どちらも点で表せていることがポイントです。
さて、ボールが建物の中を飛び回ります。もちろん、壁に当たると跳ね返ります。
次のようにぶつかっていた時、どう跳ね返らせればよいのでしょうか?
実際には壁の点は十分細かく配置されているとすると、中心から一番近い点の向きに、平らな壁があるものとして考えれば良いと分かります。
灰色の線が向き、黒い線が想定される平らな壁です。
ボールが進んでいた方向を緑の線で表すと、黒い線の壁に、緑の線の方向に進んでいる、青い点でできたボールが当たった時の衝突、ということになります。
もちろん、緑の線が通っている青い点だけがDirection=1になっています。
衝突して向きが変わるということは、「Direction=1の点と他の点のスコアが入れ替わる」と考えることが出来ます。
/execute 青い点のどれか ~ ~ ~ /scoreboard players operation @s Direction >< @e[tag=Ring,scores={Direction=1},c=1] Direction
このような感じのコマンドを実行したいわけですね。
さて、どれがその青い点なのでしょうか。どうやって選べば良いのでしょうか。
続きは別の記事にしますので、挑戦したい方は是非考えてみてくださいね。