弾幕風製作の基本その2 計算 今回は弾幕を作る上では欠かせない計算について確認しましょう。 面白い弾幕を作るには少々難しい計算も必要になってしまいます。 焦らずゆっくり会得しましょう。 基本的な所から確認していきます。 @演算子の確認 コンピュータの計算に使う演算子は、日常で使う物と大分異なります。 まずは演算子についてチェックしていく事にしましょう。 + →足し算 - →引き算 まあこの2つは大丈夫でしょう * →掛け算 / →割り算 この辺りは確実に覚えて下さい。 ^ →累乗 2の2乗は2^2と表します。 例 3+2=5、5-3=2、2*6=12、8/4=2、3^4=81 ここで注意したいのは平方根は√を使って表せないという事。 √は主に2点間の距離を求めるときに使います。 例えば、旧作の岡崎夢見が、苺クロスを出す前に自機位置をロックオンして予告線を出しますね。 予告線自体は細いレーザーで代用できます。 問題はその長さ。ロックオン中は常に敵と自機の距離に合わせなければなりません。 そんな時に敵座標と自機座標の2点の間の距離を計算して出す必要があります。 敵座標を(x,y)、自機座標を(p,q)とすると、 その間の長さは√(x-p)^2+(y-q)^2です。(平方根は後の式全てを覆います) これは高校の数学Uで習う公式です。 しかし弾幕風では√は使用することができません。 一体どうしたらよいのでしょうか? ここで必要となる知識がこれまた高校の数学Uで習う指数の計算です。 平方根は1/2(2分の1)乗で表される事を利用すればいいのです。 つまり、実際に弾幕風で使うときは、 ((x-p)^2+(y-q)^2)^1/2とすれば正しく計算されます。 このように岡崎教授を再現するには数学Uの知識が必要になります。 流石教授w 教授の予告線を再現するにはレーザーオブジェクトの知識も必要になるので、 後で再現してみましょう。 最重要事項↓ ・弾幕風では平方根は使えないので1/2乗で代用する。 A三角関数 敵の少し離れた周囲から弾幕を出す、ある弾幕の周りを別の弾幕が公転する、 そんな時は三角関数を使わなければなりません。 やはり高校の数学Uで習いますが、数学で習うとき以上にしっかりとした理解が必要です。 弾幕風でよく扱う三角関数はsin()、cos()の2つです。 sin()はy軸方向の移動を表し、cos()はx軸方向の移動を表します。 この2つの動きが合わさり、あたかも円形に動いているように見えるのです。 ここでは分かりやすくするために、にとりのお化けキューカンバーを例にします。 レーザー発射点は常ににとりの周りを公転していますね。 あれを再現するには「媒介変数表示」という高校の数学Vの知識を利用します。 中心座標が(a,b),半径がrの円を方程式で表すと(x-a)^2+(y-b)^2=r^2となります。 ですが弾幕風でこんなものを利用できるはずがありません。 そこで媒介変数表示を利用します。 弾幕風ではCreateShot01等では、弾の出現地点をx座標とy座標で指定していましたね。 そこで、x座標とy座標を指定するときに円を描くように設定すればいい訳です。 何のことやらわからない人の為にもう少し詳しく説明すると、大学の数学の「実数の連続性」が関係しているのです。 実数の連続性とは、全ての数直線、グラフは実数の点が連なって出来ているということです。 砕けて言えば線は点を打ちまくって作られているという事です。 そこでその実数の連続性を利用して考えると、点を打ちまくって円を作ればいいという事になります。 にとりの周りを回るレーザー発射点は円状に移動しているのではなく、実は1フレームで消える発射点を出現させまくっているのです。 そして打ちまくった発射点はそれぞれ固有のx座標とy座標を持っています。 にとりの周りに出来る公転円は、ある法則によってx座標とy座標が設定される発射点の集まりという事ですね。 そういうふうにグラフを点の集合体と見なし、その点一つ一つのx座標とy座標の式からグラフの式を作る事を「媒介変数表示」というのです。 円の媒介変数表示は次の通りです。 x=cos(t)  y=sin(t) この式に含まれるtを「媒介変数」といいます。このtがグラフを作る各点の一つ一つの点の位置を操作するのです。 さて、ここで一度お化けキューカンバーのレーザー発射位置を設定するステートメント(文)を作ってみましょう。 角度や速さは今回は無視して8つの引数のうち最初の2つの出現位置だけに注目します。 CreateLaser01(cos(t),sin(t),…); 射出型レーザーなのでCreateLaser01を使います。 レーザー設置位置のx座標、y座標には媒介変数表示の式をそのまま入れます。 これで起動してももちろんエラーになってしまいます。 媒介変数のtは事前に普通の変数と同様にlet t=0;と宣言しておきます。 そして、 loop{ CreateLaser01(cos(t),sin(t),…); t++; wait(15); } のようにスクリプトを組めば、媒介変数tが常に変化し、それに伴い一定スピードでレーザー発射点がにとりの周りを回転移動するようになります。 …と思いきやいざ起動させてみると画面内に弾は全く見当たりません。 実は「sin(),cos()は(0,0)を基準としている」のです。 弾幕風の(0,0)と言ったら当然画面外ですね。 ここでレーザーの発射点を高校の数学Cの「1次平行移動」という知識を使ってにとりの周囲まで持ってこなければいけません。 と言ってもこれは簡単で、この場合基準とする点の座標の分だけ各媒介変数表示の式に足せばよいのです。 loop{ CreateLaser01(cos(t)+GetEnemyX,sin(t)+GetEnemyY,…); t++; wait(15); } これで今度こそにとりのお化けキューカンバーになると思いきや、今度は出現するポイントがにとりから全く動きません。 これはどういう事かというと、「描いている軌道の円が小さすぎる」のです。 上記の式では円の半径は媒介変数表示の式でのデフォルトの1ドットのままです。 この円を拡大しなければなりません。 拡大するには拡大倍率を各式に掛ければよいのです。 loop{ CreateLaser01((cos(t)+GetEnemyX)*100,(sin(t)+GetEnemyY)*100,…); t++; wait(15); } これでレーザー発射点だけはお化けキューカンバーになりました。 このように円を操るには三角関数と媒介変数表示を使いこなす必要があります。 霊夢の陰陽玉の軌道も魔理沙の使い魔の軌道もアリスの人形の軌道も媒介変数表示から出来ています。 そしてこの媒介変数表示をマスターすればこいしのロールシャッハも思いのままに作れるのです。 最重要事項↓ ・円やグラフは媒介変数表示にしてから描かせる。 ・媒介変数表示を利用した時は平行移動と拡大を忘れずに行う。