6/22(土) 全体停止メンテナンス
【赤石AIの思考ログ】ボールと壁の衝突(1)【BE】

【赤石AIの思考ログ】ボールと壁の衝突(1)【BE】

Ad

コマンドでボールを表現したいとき、あなたはどうしますか?
きっと、エディションによって、バージョンによって、そして人によって、様々なボールが出てくるでしょう。

ここでは、マインクラフトの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
このような感じのコマンドを実行したいわけですね。

さて、どれがその青い点なのでしょうか。どうやって選べば良いのでしょうか。
続きは別の記事にしますので、挑戦したい方は是非考えてみてくださいね。

Ad

Twitter でフォロー

Google アナリティクスの統計

generated by GADWP 

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください