提供: Japanese Scratch-Wiki

このきじは ひらがなのページがありません。ごめんなさい。編集者向け:作成する
物理エンジン とは、物理的な運動の様子を計算して表示するための汎用的なプログラムのことである。ここでいう運動には、ジャンプ、落下、はね返りなどが含まれる。物理エンジンは、いろいろな場面で共通する物理現象を扱うため、一度作成しておけば、ほかの様々なプロジェクトで活用して、同じようなスクリプトを何度も作る手間を省くことができる。優れた物理エンジンは、多くのScratcherによって利用されることが多い。この記事では、Scratchで使用できる物理エンジンの例を紹介する。
Warning メモ: ここに記載のサンプルはあくまで物理エンジンの一例である。

サンプル

このサンプル[1] は、1つのスクリプトでできており、用意するコスチュームも1つで構わない。次のような物理運動に対応している。

  • 床が水平であっても、斜面であっても、床に合わせて移動する
  • ジャンプする
  • 特定の色との衝突判定 (スプライトにあわせて変更)

以下のスクリプトは、物理運動を行うスプライトに記述する。

@greenFlag がクリックされたとき
[x速度 v] を (0) にする // 左右スピードを0にする
[y速度 v] を (0) にする // 上下スピードを0にする
ずっと 
  もし <[右向き矢印 v] キーが押された> なら // スプライトを右に動かす
    [x速度 v] を (1) ずつ変える // "x速度" は左右の移動スピードなので、これが1増えると右向きの移動速度が1速くなる
  end 
  もし <[左向き矢印 v] キーが押された> なら // スプライトを左に動かす
    [x速度 v] を (-1) ずつ変える // 左向きの移動速度が1早くなる
  end
  [x速度 v] を ((x速度) * (0.9)) にする // 速度が速くなりすぎないよう、徐々にスピードを落とす
  x座標を (x速度) ずつ変える // スプライトを実際に動かす
  もし <[#1B2BE0] 色に触れた> なら // 坂道や壁にぶつかったとき
    y座標を (([絶対値 v]\((x速度)\)::operators) + (1)) ずつ変える // 横向き速度が速ければ速いほど、坂を登るスピードも速い
    もし <[#1B2BE0] 色に触れた> なら // 坂道の傾斜が大きすぎるとき
      y座標を ((0) - (([絶対値 v] \((x速度)\)::operators) + (1))) ずつ変える // 坂を登った分を戻す
      x座標を ((0) - (x速度)) ずつ変える // 直前のx座標 (坂の下) まで戻す
      [x速度 v] を ((x速度) / (2)) にする // 坂道と壁にぶつかると、速度が落ちる
    end // 
  end //
  もし <[上向き矢印 v] キーが押された> なら 
    y座標を (-1) ずつ変える // 通常、スプライトはプラットフォーム (地面) の1ピクセル上にいるため、地面の上にいるかどうかをチェックするには、y座標を1減らす必要がある
    もし <[#1B2BE0] 色に触れた> なら // プラットフォーム上にいれば
      [y速度 v] を (10) にする // ジャンプに必要なスピードを追加
    end
    y座標を (1) ずつ変える // 地面の上にいるかどうかを確認するときにy座標を1減らしたので、ここで1増やして元に戻しておく
  end
  もし <(y速度) < (3)> なら // ジャンプの最高点あたりにいるときと、落下しているとき
    y座標を (-1) ずつ変える // プラットフォーム上にいるかどうかをチェック
    もし <<[#1B2BE0] 色に触れた> ではない> なら //プラットフォーム上にいなかったとき
      [y速度 v] を (-1) ずつ変える // 重力を加えて、着地スピードを速くする
    end
    y座標を (1) ずつ変える // 先ほどy座標を1ピクセル減らしたので、ここで元に戻す
  end 
  [y速度 v] を ((y速度) * (0.9)) にする // 現実の物理運動のように、速度を徐々に変化させる
  y座標を (y速度) ずつ変える // 1つ前のブロックで設定した速度を、ここでスプライトの座標に適用して、実際にスプライトを上下に動かしている
  もし <[#1B2BE0] 色に触れた> なら // 床や天井に触れたとき
    y座標を ((0) - (y速度)) ずつ変える // 移動方向を逆にする
    [y速度 v] を ((y速度) / (2.5)) にする // 衝突後は、上下のスピードをスプライトがほぼ止まるくらいまで大幅に減らす
  end //
end

ただし、このスクリプトではジャンプした後の部分でバグが発生することがある。着地地点が壁のすぐ近くの場合、床から1ピクセル以上離れた場所で止まってしまう (それ以上ジャンプできなくなる)ことがある点だ。この場合、画面の端に移動すると、スプライト位置が多少沈んで、元通り操作できることが多い。

関連項目

参照

  1. #p1190320 https://scratcharchive.asun.co/forums/viewtopic.php?id=89988#p1190320