配列と比例を使った放射弾のつくり方

・・改めて、発表のときの動画を見返してみましたが、先生がうろたえてみえるので、それは驚いていらっしゃったからだそうですが(まさかあのようなものが出てくるとは思ってなかったでしょうね)、でもそのときはどうしてうろたえているのか私もわかりませんでしたので私は私で「あちゃー外したかな?」と思ってどぎまぎしています。それ以前に、人前で自分の作品を披露して反応を確かめたのも生まれて初めてです。見ながらいろいろ笑ってしまいました。

「しめじ先生の大冒険」の中で、実は一番気に入っているのは、おたすけボタンをクリックしたときに、おざき先生から一斉に発射される矢が、みんなのところへ放射されるところです。

これは、プレゼンのときに通常モードではなかなかクリアまでいけない場合に、ショートカットしてクリア画面を見ていただくためにつくりました。

これは、先生のキャラがどの位置にいても、矢が放射状に一人ひとりをめがけて向かっているように角度を変えて飛んでいくところがきれいで我ながらうまくできたなーと思っています。

当然、最初は垂直の矢が、みんなに向かって垂直の角度で飛んでいくわけです。それではおかしい感じなので、角度をつけることにしました。

その際に、本当なら、三角関数を使ってその都度計算するのが正確なのでしょうが、ここではそういう難しいことはせずに、擬似的に、距離と角度についての比だけで、つくってみました。思いの外うまくいって一発でできたので、自分でも驚いたので記録しておきたいと思います。

例えば、しめじ先生が左端Aの位置にあるとします。すると、左下のゾンビに向かう矢の角度は、垂直方向に対して0°です。そして、しめじ先生が右端Bの位置に移動したとすると、Aの位置の矢の角度に比べて、右回転方向にa°回転すればいいわけです。

そこで、角度の計算ソフトを使うか、目分量でもいいので、角度の最大値(一番端に来た時の角度)であるa°を決めます。この場合40°くらいです。ですので、しめじ先生が「Aの位置(ゾンビから最も近い位置)からBの位置(ゾンビから最も離れた位置)に動いたとき、矢の角度が0°(最小値)からa°(最大値)に変化する」というように比例させればいいと考えました。

上の例はゾンビが端ですが実際は13体それぞれ違った位置にあるので、それぞれについてこの考え方を適用すると、一つひとつのゾンビとしめじ先生について「x座標の距離」に比例させればいいということになります。(x座標が同じなら角度0°、最大離れた時が角度40°となるよう比例させればよい

お助けモード発動

配列は、授業ではやっていないと思いますが、たぬきが飛びながらコインをとる横スクロールのゲームのときに、先生がサンプルを掲示板に貼ってくださったものを参考にしています。

配列と当たり判定

この中で、矢を放つ部分は以下です。

ゾンビは上の段と下の段の二列に別れているので、そのように書きました。上下に数値をずらして一つでまとめて書こうと思えば書けると思いますが、面倒だったので分けました。

この中で以下のように矢の傾きを計算しています。

// 矢の角度を変えるための計算
//var k = 52 / 225 * (teache.x - zombies[ya].x) 
//arrow.rotate(k);

kが、矢の回転角度です。それぞれのゾンビの位置に対応させてこの角度に傾けたいということです。角度の最小値と最大値(ゾンビとしめじ先生が最も離れたときの矢の角度)が-52°と52°、しめじ先生とゾンビのx座標の距離の差の最小値が-225、最大値が225なので、分母を225にすれば、しめじ先生とゾンビが同じx座標にあるときteache.x – zombies[ya].x=0、最も負の方向に離れたときは=-225となり、矢の角度は-52°(最も負の方向に傾く)から、同じx座標のときは0°(垂直)になって、また正の方向に離れれば離れるほど52°に近づいて矢が傾きます。

距離の変化(-225〜225の変化)に対応して、-52°〜52°の範囲で自動的に変化させることができます。

2 Replies to “配列と比例を使った放射弾のつくり方”

  1. ほ~(゜o゜)
    X座標の差の最大値と最小値で傾きの最大角を決めて、その間は比を使って求める。すごい!
    先生がどこの位置にいても、ゾンビへ放射状に矢を傾けて放つコードは、こうやって考えたんですねー。
    コロンブスの卵~

    わたしだったら、垂直に矢が放たれるのは、絵的に多少不自然でも「ま、いっか」と
    あっさり諦めてしまうなぁと思いました(^^;根気がないというか…。

    教室の生徒さんや特に先生は、ゲームのディテールにほんとにこだわってますよねー。
    「イージング」とか、「BOX2D」とかリアルを追及するというか。

    プログラマー気質?とでも言うべきか。みんな追求型の性格の人が集まってるんだなぁっと思います。

  2. 子供たちにやってもらうんですが、容赦ないんです・・
    これ変、ここおかしいとかetc・・
    こちらも意地になりますが、妥協も肝心で。
    こだわりと妥協のバランスが難しい・・ですね(・∀・)

コメントを残す

メールアドレスが公開されることはありません。