只今STG製作中。
「龍神録プログラミングの館」を参考にした結果、
自機ショットクラスより先に敵クラスを作ったほうがいいかな、と考えて、
敵の移動パターンの実装について考えています。
一番の悩ましいところは、敵を移動させる方法です。
自分の考えた限りでは、以下の要素があります。
・座標ベクトル
・速度ベクトル
・加速度ベクトル
・角度
・速さ
簡単に管理できるのは、「座標+速度」でしょうか。
移動処理では速度に演算をしていって、ループの最後に座標に加算する方法です。
速度は毎ループの最後か最初に初期化します。
「座標+速度+加速度」なら、なめらかな移動が簡単です。
移動処理では加速度に演算をしていって、ループの最後に速度に加算し、
そのあと座標に速度を加算します。
加速度は毎ループ初期化、速度は毎ループ減少させます。
「座標+角度+速さ」という管理方法ではどうでしょう。
角度をx,y成分に分解してから速さを掛けて座標に加算する方法です。
角度で分かりやすく操作できるので、思いどうりに動かせそうです。
でも、どの方法を使っても、円運動(ある点の周りをぐるぐる回る運動)が面倒そう…
ひとまずは「座標+角度+速さ」がSTGに適していそうです。
角度と速さで代入・参照できるベクトルクラスがあると便利そう。
書きながら考えるとわりと思い浮かぶね。
そんなこんなで自己完結してしまいましたが、
よろしければ皆さんなりの動かし方も教えて欲しいです。
歩き方は?/プログラミング日記
Re: 歩き方は?/プログラミング日記
敵クラスは派生しないのですか?
自分は敵基底クラスを継承して、
・回転移動する敵クラス
・移動テーブルを参照しながら移動する敵クラス
・追尾移動する敵クラス
というふうに増やしていきます。
敵基底クラスは座標とインターフェースとなるメンバ関数のの宣言くらいでしょうかね。あとで思い付いたら追加していく感じで。
自分は敵基底クラスを継承して、
・回転移動する敵クラス
・移動テーブルを参照しながら移動する敵クラス
・追尾移動する敵クラス
というふうに増やしていきます。
敵基底クラスは座標とインターフェースとなるメンバ関数のの宣言くらいでしょうかね。あとで思い付いたら追加していく感じで。
Re: 歩き方は?/プログラミング日記
自分の場合基本的に運動は力と質量を定義して物理法則に従わせて動かす場合(なめらかだが計算がめんどくさい)とそうでなくて行動パターンを初めからインプットしてしまう場合があります。(龍神録プログラミングの館のサンプルプログラムのように)
後者の場合で円運動をさせるには定点を回るよう座標をプロットしてそこに直接物体を描写します。
前者の場合は少し複雑で、自分の好きな運動をさせたい場合にはウェイポイントを導入してそれを追尾させるようにしています。例えば円運動なら物体が円上のある点を通過したら、少し先の点を指定し、それを追尾させます。
この場合は遠くからやってきても、自分自身でめんどくさい計算をせずに円運動に移行できるのが利点ですが、少々計算が重たいです。
.
後者の場合で円運動をさせるには定点を回るよう座標をプロットしてそこに直接物体を描写します。
前者の場合は少し複雑で、自分の好きな運動をさせたい場合にはウェイポイントを導入してそれを追尾させるようにしています。例えば円運動なら物体が円上のある点を通過したら、少し先の点を指定し、それを追尾させます。
この場合は遠くからやってきても、自分自身でめんどくさい計算をせずに円運動に移行できるのが利点ですが、少々計算が重たいです。
.
Re: 歩き方は?/プログラミング日記
みなさんアドバイスありがとうございます!
頭の中のごたごたがスッキリしました!
>ISLeさん
あれからなんやかんやあって、結局派生することにしました。
やっぱりC++をやるなら派生ですよね。
基底クラスの空っぽの移動ルーチン(関数)を派生クラスでオーバーライドするだけ!
派生って素晴らしい!
>GRAMさん
円運動のアドバイスありがとうございます。
座標を直接書き換える方法と、目の前にターゲットを置いて追尾させる方法ってことですかね。
昔そんな感じのを書こうとしたような・・・しなかったような・・・
ちなみに確実ではないですが、
一定の速さで進んで進む方向を一定の速さで回転させる方法も考えてました。
頭の中のごたごたがスッキリしました!
>ISLeさん
あれからなんやかんやあって、結局派生することにしました。
やっぱりC++をやるなら派生ですよね。
基底クラスの空っぽの移動ルーチン(関数)を派生クラスでオーバーライドするだけ!
派生って素晴らしい!
>GRAMさん
円運動のアドバイスありがとうございます。
座標を直接書き換える方法と、目の前にターゲットを置いて追尾させる方法ってことですかね。
昔そんな感じのを書こうとしたような・・・しなかったような・・・
ちなみに確実ではないですが、
一定の速さで進んで進む方向を一定の速さで回転させる方法も考えてました。