16. 敵の移動パターン(円運動)
単に円運動させるだけならば簡単ですが突然円運動しながら現れるわけにはいきません。
途中まで直線で登場し、ある地点にさしかかると滑らかに円運動を始めるほうが美しいですね。
先ほどのサンプルをすでに見た方はどんな動きをするか実感がわくと思います。
図のようにはじめ直線で表れ、途中から円運動を開始させましょう。
ここからちょっと頭を使うんですが、円運動を始めた地点を地点Aとします。
地点Aの時、円運動を始めた直後、
Xの増加は0ですね。
そこからπ/2つまり90度移動した地点では増加量は1になっています。
さらにπ/2移動すると増加は0
さらにπ移動すると増加は−1になっているはずです。
0→1→0→-1
という動きは、sinの角度0から始まった円運動だという事がわかります。
この場合、Xの増減しか考えていないので単振動といいます。
一方
地点Aの時、円運動を始めた直後、
Yの増加は1ですね。
そこからπ/2つまり90度移動した地点では増加量は0になっています。
さらにπ/2移動すると増加は-1
さらにπ移動すると増加は0になっているはずです。
1→0→-1→0
という動きはsinのπ/2 (つまり90度)から始まった円運動だということがわかります。
ですから、円運動を始めるときは、xは角度0から、yはπ/2から運動を始める必要があります。
enemy[i].x+=sin(PI*(enemy[i].counter)/160.0f);
enemy[i].y+=sin(PI*(enemy[i].counter+80.0f )/160.0f);
今半円を描く周期が160カウントの運動を表現しています。yの値はカウンターに80が足してあるのは90度先にいかないといけないので
半周期分プラスしてあるのです。これを元に、サンプルを見てください。
void EnemyPattern4(int i){ if(enemy[i].counter<100) enemy[i].y+=2.5f; if(enemy[i].counter>=100){ enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f; enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f; } }
エネミーカウンターが100までは直線でおりてきます。円運動を始める時、すでにカウンターが100になっているので引いています。
最後に2.5をかけているのは円を大きくするためです。この値を変えることで円の大きさが変わり、
160の値を変化させることによって円を描く早さが変わります。
160の値を変えたときは、yのsinを半周期分進める事に注意してください。
140に変化させたのなら70足してやる必要があります。
かならず偶数で変化させましょう。
サンプルプログラムはすでに書きましたので、前章を参考にしてください。
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi
Yamada.