はじめに
地元でやっているのCoderDojoってやつに参加してきました。長男はscratch3.0の新機能であるmicro:bitとの連携という今っぽいことをしておりました。他の子どもたちはどんなの組んでいるかなぁと聞き耳立てていたら「ジャンプってどう実装するんだろう」という話が聞こえてきたんですよ。
物理好きなおじさんとしては「どれどれ・・・」と行きたかったのですが、初参加というのもあり遠慮しました。帰ってきたらいつの間にか作っていたので公開します。とはいえ、落下と慣性に関する実装です。
ジャンプに関しては、ボタンを押したら常に同じ高さまでジャンプする方式と、マリオのように押し続けた長さでジャンプの高さが変わる方式がありますが後者をどうやったらscratchで組めるかについては状態の管理がちょっと難しそうですが、思いついたらやってみるかもしれません。
とりあえずリンク
遊んでもらうことは目的としていないのですが、ちょっと慣れたお子様ならゲームとして完成させてくれることは難しくないでしょう。
いつものscatchのねこにかつらをかぶせてニュートンと名乗らせています。演算の内容としてはガリレオ・ガリレイですが、ピサの斜塔でクレイジークライマーを作るのはちょっと大変そうだったので・・・
りんごの落下について
重力というのがどのように働くかというのを実装しています。
重力の表現としてはだんだん早くなるという表現が必要になりますが、実際の物理では時間当たりの早くなる速度というのは一定です。つまり、時間ごとに速度を変化させれは重力の表現ができます。
落下の表現はこれになります。
0.1秒を1コマとして、1秒に3(ピクセル?)の加速をする設定にしています。数学で表現するとなかなか大変ですが、プログラムで書くと意外と単純なところがうれしいですね。喜びのあまり小学六年生の息子に見せました。
ゲームによって設定は変えるといいです。実際、りんごが落ちる表現として、表示されてから0.5秒後に落下を始める設定にしてあります。
ねこのニュートンの慣性付きの移動について
慣性に関しても落下と同じでこのような動作を組んであります。
- 0.1秒ごとに速度分だけ移動させる
- 矢印キーを押されている間は2ずつ速度を上げる
- 速度の最大値は16とする
- やじるしの入力がないと速度は1ずつ下がる
最大速度に関しては、この場合は最高速度に達するのに1秒かからないので急に加速が止まっています。レースゲームで車の加速を表現するなら空気抵抗として速度に比例した反作用を付けると自然な加速の表現ができると思います。
0.1秒ごとに速度分だけ移動させる
マイナスの値をとると左向きのに移動します。
やじるしの入力がないと速度は1ずつ下がる
今度はちょっとややこしいです。
速度はプラスとマイナス両方を取りますので、速度を減らす向きが違いますので、もし~でなければを使っています。また、速度が0の場合も考慮に入れてあります。(さらに速度が整数を取らない場合や減速の係数が1でない場合などはもっと複雑になります。)
矢印キーを押されている間は2ずつ速度を上げる
右と左ではプラスマイナスが違うだけなので右のみで・・・
速度の最大値は16とする
さいごに
数式より簡単にかけたのでちょっとうれしいです。実際のコードは リンク を見てください。
できるだけ若い方にも読んでもらえるように書いたつもりですが、わからない部分について質問をお待ちします。