※ 当ページには【広告/PR】を含む場合があります。
2020/11/16
Pスクール厳選・優良な教材プログラムの紹介コーナー① 〜 Pixel Town Remaster編
Pスクール厳選・優良な教材プログラムの紹介コーナー③ 〜 ヘビゲーム編
プログラムでの物理エンジンとは、物理(力学)運動をできるだけ再現するための計算を提供するための演算処理を行うものです。2次元(縦と横)ゲームでも、スプライトをとある法則性をもって運動させれば、ジャンプ/落下/衝突などに現実の世界と同じように動いているかのように見せることができるようになります。今回は他のスクラッチプログラマーの方が公開されている物理エンジンのサンプルを覗いてみて、プログラムがどのように実装されているかちょこっとだけ紹介します。
【Pschool厳選】Scratchを学べるオンライン・駅前プログラミングスクール5選
自分専用の物理エンジンを作る
子供たちに物理エンジンを理解させるのは簡単なことではありません。もし本格的なゲームを作成したい小中学生に物理エンジンを教える際には、「ゲーム中にキャラクターをかっこよく落ちさせる・ジャンプさせる・何かにあたって跳ね返らせる方法」と簡単な話で済むのかも知れません。物理エンジンを本当に理解出来るようになるには、力学
の考え方は高校物理を習う必要があり、それゆえ、小中学生のお子さんに数式で理解するのは一般には困難です。ということで、とりあえず数式の話などの小難しい話はこの記事ではおいて、「物理エンジン」=「何かスプライトをいい感じに動かす仕組み」とお茶を濁しておきます。さて、物理エンジンは、一度作っておくとその後いろいろなゲームで使い回せるゲーム開発には無くてはならないライブラリであり、知っておくと様々なプロジェクトに活用できて、また子供たちの科学の目も養える教材です。「説明が難しそうだから」という先入観はなしに、積極的にプログラムを組んで教えてあげたいと思っている次第です。この記事ではいくつかプログラム例を出して、動きの解説と物理エンジンの実装を見ていきたいと思います。はじめての物理エンジン
スクラッチのウェブサイトのトップメニューから見る
で、物理エンジン
と検索することでも色々なサンプルを参考にすることができます。たくさんあるので目移りしてしまうのですが、当ライターの独断と偏見で気に入ったものをチョイスしてみます。まずは最初ですので、理解を進めるために簡単なサンプルのプログラミングの中身を少し詳しく解説させていただくとしましょう。物理エンジンとして単純で良いサンプルだと思ったのが、こちらの方のただ丸いボールが落ちるのを眺めるだけの物理エンジンです。ボールの落下する動きと傾きのついた棒との衝突を確認するためのプログラムで、🚩
を推すたびに棒の傾き15°から40°の間でランダムに変化し、落下の様子の違いを確認することができます。実装はすこぶるシンプルで、まずはオレンジの棒のスプライトの方ですが、スタート時にグローバル変数・角度
が傾き15°から40°の間でランダムの値に設定されます。ボールのスプライトの方は、落下しながらオレンジの棒に当たると跳ね返るを繰り返す動きを以下のブロックで実装しているようです。①ではxの移動量
とyの移動量
の2つの変数を使ってループごとにx座標y座標を変えて動かしている部分になります。物理エンジンを抽象化すると、つまるところここで言うxの移動量
とyの移動量
をその時の時間で計算した値を与えるプログラムのこと指しています。どんな計算を詰めて値として返すかは、プログラマーの腕の見せ所であり、この方は摩擦
と言う変数を与えることで、よりリアルなボールの落下と衝突を再現されておられます。図の②の部分は衝突した時の処理で、棒に衝突した時だけxの移動量
とyの移動量
が再計算される仕組みを採用されております。またボールが水平方向に加速しすぎないようにxの移動量
が3よりも大きくならないような調整が行われています。この時のy座標を3ずつ変える
も重要な調整量で、ボールと棒が当たったら少し上に押し戻して、衝突条件がずっと真にならないようにしている工夫です。これはスクラッチの物理エンジンにはよく見られるテクニックのようです。③の部分は棒に当たっていない時=自由落下の状態です。これはyの移動量
が一定量で少しずつ下がるようにされています。凝った物理エンジン
もう一つ違ったサンプルも見ていきます。こちらの方の物理エンジンはスプライト運動に回転運動も再現しようとされているので、より力学チックに運動をさせるときに参考になります。ボールのスプライトの実装は以下のようになります。先ほどのサンプルで言うところのxの移動量
とyの移動量
はこちらでは速度x
と速度y
と言う変数名で扱われています。ループごとに速度x
と速度y
を計算するのが、加速度計算
の定義ブロックとその加速度を元に値を更新する速度計算
の定義ブロックです。このサンプルではスプライトが回転運動も行わせるための工夫が、トルク計算
と回転速度計算
のブロックです。トルク
とは、大きさのある物体(専門的には剛体と呼んでいます)に働く回転させる力になります。物理エンジンに回転運動が加わる場合には、変数・回転速度
も重要なパラメータになってきます。スイミーの物理エンジン
こちらは実践的な例をあげます。ファンプレーヤーの方も多いスイミーというゲームの作者の方は公開されているゲーム内で使われた物理エンジンです。この場合、上キーを押すことでジャンプできるようなスクリプトも物理エンジンに追加されることで、アクションゲームのような動きを再現しています。キーでスプライトの移動をさせているので、先ほどの物理エンジンと比べてキーの受け付けるタイミングを然るべきブロックの位置におかなければなりません。①は自由落下の部分です。壁や床(黒色の背景)に当たっていない場合にゆっくりと落下するようになります。②は左右に移動するためのキー操作を受け付けます。③でまずx方向に移動する量を計算して、その分水平にスプライトを移動させています。④はスプライトが床面に当たった時の処理です。この部分がないと、スプライトのy方向の移動によって、壁面に一旦めり込むような状態(最大で4)になります。すると、ずっと当たり判定が真になってしまってプログラムがそのまま動かないことになるのを防ぐために、衝突する直前の位置まで押し戻すの処理のようです。⑤が衝突時の処理です。スプライトが跳ね返る時の速度x
及び速度y
の再計算を与えるところです。⑥で垂直方向の移動を行います。もしこの移動で床面に触れることがあるようなら、⑦のブロックで速度y
を一旦ゼロにしてそれ以上は進まないように工夫します。⑧の段階でようやくジャンプさせる処理を受け付けます。ジャンプを受け付ける場合、壁面に触れていることが条件になりますので、スイミーのあの独特の壁面三角ジャンプができているのはこの部分からなのかなと推測されます。
【Pschool厳選】Scratchを学べるオンライン・駅前プログラミングスクール5選
まとめ
3つの例で物理エンジンのプログラミングのポイントを取り上げてみました。実際に自分の手でオリジナルの物理エンジンを組んでみると、今までにない面白い動きができるかもしれませんので、ぜひプログラミングにトライしてみてください。参考
物理エンジン・スクラッチ公式ガイド