• Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • HOME
  • Arduino
    • Arduino初心者編
    • Arduino基礎編
    • Arduino応用編
    • Arduino実践編
  • Raspberry Pi
  • microbit
  • XBee
  • Scratch
  • Contact Us
  • Privacy Policy

STEMSHIP

ものづくりを通して、科学を学ぼう!

現在の場所:ホーム / Scratch / Scratch コード解析で学ぶ:ボールの落下・跳ね返りを物理的に演算する

Scratch コード解析で学ぶ:ボールの落下・跳ね返りを物理的に演算する

2020年2月8日 by STEMSHIP コメントを書く

Scratchのゲームを作っていると、物を落下させたり、壁で跳ね返らせる動きをさせたいことがあると思います。現実世界と同じように、ボールの空気抵抗による移動速度の減速や、跳ね返りによる速度減速など、どのようにコードに落とし込めばいいでしょうか。物理的な意味も考えながら、コードを解析してみましょう。

Bouncy Ball Physics

 今回解析するのは 、 「Bouncy Ball Physics 」というプロジェクトで、Legomariobros さんが作成されたものです。

ボールをマウスでドラッグして離す動作

 ボールをマウスでクリックした状態で、他の場所へマウスをドラッグしてから、マウスのクリックを解除すると、ボールは勢いよく進み出します。このときの速度を決めているのが、下記のコードです。ポイントは、変数「Drag?」でマウスが押されている状態を1,押されていない状態を0で表しています。この変数は、別のコードで使用します。X方向の速度(X velocity)とY方向の速度(Y velocity)は、マウスの座標と元々のボールの座標との差分にしています。速度を計算したあとは、ボールを「マウスのポインターへ行く」で移動させます。これを、マウスが押されている間はずっと実行します。

ボールの初期の速度を決めるコード

ボールが壁にぶつかったときの位置と速度

 次のコードは、壁にぶつかったときのボールの位置と速度を設定しています。壁は上下左右の4箇所あり、コードも同様の内容のものが「もし~なら」で4つ書かれています。例として、1つ目のコードについて説明します。もし、右側の壁を通り越すX座標の場合は、そうならないように、217.5で制限をかけています。そして、X方向の速度を-0.8倍することで、移動方向を反転し、速度を80%に落としています。現実世界で例えると、ボールのエネルギーの20%が壁との衝突で失われて、80%のエネルギーで跳ね返っていることを意味しています。最後に、跳ね返りの音を「boing」の音で表しています。残りの3つのコードも同様の内容です。

ボールが壁にぶつかったときの位置と速度を決めるコード

ボールが壁にぶつかったときの音

 跳ね返りの音量は、ボールの移動速度と相関を持たせるため、「(X velocityの絶対値 + Y velocityの絶対値 -2)%)」となっています。最後の-2は、各々のvelocityが0に収束せず、1になるため、0%になるように調整をしているだけです。

ボールが壁にぶつかったときの音量制御コード

ボールの移動速度・落下(重力)・減速

 ボールの見た目とボールの移動速度・落下(重力)・減速は、以下のコードでプログラムされています。まずは、見た目について。「ずっと」のループの中で、「コスチュームをBallにする」が実行されるため、変数Ballの値を変えると、即座にボールのコスチュームが変わります。「もしDrag?=0なら」は、マウスでボールをドラッグしていない状態の時を意味しています。もし、マウスでボールをドラッグしているときは、ボールの動きをさせたくないため、このブロックが使われています。「もしDrag?=0なら、でなければ」は、Ball =1は単色のボールですが、その他のボールは模様がります。模様があるボールは、速度に応じてボールを回転させるという見た目の動きをつけています。
 ボールの移動については、「x座標を(x座標+X verocity)、y座標を(y座標+Y verocity)にする」で記述されています。現在のx,y座標から、X verocity,Y verocityの数値分だけ移動します。そして、ボールの移動が徐々に少なくなるように、0.99を掛け算しています。現実世界で例えると、ボールの空気抵抗を簡易表現したものです。y座標に関しては、Gravity*0.5を減算することで、重力による落下を簡易表現したものです。
 最後の2つのブロックは、ボールの速度によって見た目を変えるもので、1つ目はボールの色、2つ目はボールの軌跡を描くペンの色の設定です。

ボールの移動速度・落下(重力)・減速 のコード

ペンでボールの軌跡を描く

 ペンは、ボールが移動する軌跡を描くためのものですが、変数(Trail, Color, Gravity, Ball)を画面に表示/隠すのコードがここに記載されています。スペースキーを押すとこで切り替えることができます。変数の役割は下記のとおりです。

Trail   … 0:ボールの軌跡を描かない  1:ボールの軌跡を描かく
Color  … 0:軌跡の色を変えない  1:軌跡の色を変える
Gravity  … ボールの重力。数値が大きいほど重力が大きい。
Ball   … ボールのコスチューム

 変数TrailとColorは、初期値をともに0とします。Trailが0なので、ペンを上げた状態にします。同時に、ペンの太さや濃さもここで設定しておきます。

 「ずっと」のループでは、ペンの色を「PenColor+115」にするコードがあります。PenColorについては、ボールスプライトで速度に応じて値を変えるコードが書かれています。もし「PenColor>200なら、PenColorを-200ずつかえる」とすることで、PenColorの値を1にリセットしています。

ペンでボールの軌跡を描く コード1

 「message1」は、ボールスプライトから1ループに1回 送られてくるメッセージです。これを受け取ったとき、もしTrail=0ならペンを上げて軌跡をすべて消します。Trail=1のとき、Drag?=1ならペンを一旦あげます。Drag?=0なら、ペンの座標をBallの座標に移動させて、ペンを下ろします。
 「cキーが押されたとき」は、軌跡を全部消します。

ペンでボールの軌跡を描く コード2

Filed Under: Scratch 関連タグ:ペン, 物理, 重力

Reader Interactions

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

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

最初のサイドバー

CONTACT US

  • Facebook
  • Twitter
  • Youtube

More to See

Arduinoベースのセンサノード:XBeeデータ収集ノードの製作

2021年9月27日 By STEMSHIP

Arduinoベースのセンサノード:Arduinoを使った温度センサの作製

2021年9月21日 By STEMSHIP

XBeeモジュールとBMP280センサを使用してデータ収集する

2021年5月31日 By STEMSHIP

XBeeモジュールでMicroPythonを使ってセンサを読み取る

2021年5月24日 By STEMSHIP

XBeeモジュールでセンサを読み取る:センサノードの設定と測定

2021年5月17日 By STEMSHIP

カテゴリー

  • Arduino (44)
    • Arduino初心者編 (15)
    • Arduino基礎編 (11)
    • Arduino実践編 (4)
    • Arduino応用編 (11)
    • Arduino番外編 (3)
  • MakeyMakey (1)
  • microbit (11)
  • Raspberry Pi (13)
  • Scratch (6)
  • STEM教育 (5)
  • XBee (15)
  • ものづくり教育 (2)
  • 子供の教育 (2)
  • 科学 (6)
  • 算数 (5)

Tags

BLE DCモータ EEPROM ELEGOO ESP32 ESP8266 IoT LCD LED makeymakey MQTT Node-RED scratch STEM教育 WiFi XBee アニメーション オンラインゲーム カメラ クローン ゲーム コスチュームの変更 サーボモータ ステッピングモータ ステートマシン スピーカ タイマー ピンポン ブロック定義 ペン ライントレース ラジコン リスト 分数 割り込み 実験 工作 幼児 当たり判定 温度センサ 無線通信 物理 角度制御 重力 音楽

Footer

最近の投稿

  • Arduinoベースのセンサノード:スケッチ(プログラム)の作製
  • Arduinoベースのセンサノード:XBeeデータ収集ノードの製作
  • Arduinoベースのセンサノード:Arduinoを使った温度センサの作製
  • XBeeモジュールとBMP280センサを使用してデータ収集する
  • XBeeモジュールでMicroPythonを使ってセンサを読み取る

タグ

BLE DCモータ EEPROM ELEGOO ESP32 ESP8266 IoT LCD LED makeymakey MQTT Node-RED scratch STEM教育 WiFi XBee アニメーション オンラインゲーム カメラ クローン ゲーム コスチュームの変更 サーボモータ ステッピングモータ ステートマシン スピーカ タイマー ピンポン ブロック定義 ペン ライントレース ラジコン リスト 分数 割り込み 実験 工作 幼児 当たり判定 温度センサ 無線通信 物理 角度制御 重力 音楽

Search

2025年5月
月 火 水 木 金 土 日
 1234
567891011
12131415161718
19202122232425
262728293031  
« 10月    

Copyright © 2025 · STEMSHIP.COM