フォースに、敵機、敵弾との当たり判定をつけました。
敵弾はフォースに当たると used フラグが降りて消えます(特殊弾は除く)。
敵機はフォースに当たると1フレームにつき防御力を表す変数 def から0.2引かれ、0になると破壊されます。
この実装に伴って、敵の持つ変数 def を int 型から float 型に変更しました。(小数点以下を扱うケースが出来たため)
これで、通常の敵弾とヤワな敵機に対してはバリアとして働くようになりました。
敵が硬い場合はフォースを突き抜けるまでに def の値を0に出来ないので防御壁にはなってくれません。
わかり難いですが、敵機がフォースに当たった瞬間です。
波動砲ではなく、フォースによって破壊されています。
その他の改善
最近フォース以外の処理にも少しずつですが手を加えて改善していっています。
まず、以前記事にも書いていますが、現在時刻を得たい時に毎回 GetNowCount 関数を使うのは効率が悪い気がします。
そこで、毎フレーム、1フレームにかかる時間を計測するためにループの先頭で呼び出しているGetNowCount関数1回で済むように改良しました。
そのフレーム中は、どの関数もこの時刻を現在時刻として使用します。
関数の呼び出しから、変数の参照への変更ですから僅かですが処理速度も上がるはずです。
他にも関数の設計を見直したり、少しずつですが手を入れています。
例えば円の当たり判定を行う部分を当たりならTRUEを返す関数に分けました。
2つの円の中心座標と半径を Circle_Coll 関数に渡すと結果が返ってきます。
また、この関数を効率よく使うために、敵機には画像表示座標と当たり判定の中心座標との差分をデータとして持たせました。
画面座標をX、Y、差分をCx、Cyとすると、関数に渡す座標はX+Cx、Y+Cyとなります。
これで当たり判定の関数は見た目にもスッキリしてわかりやすいコードになったと思います。
でも、まだ無駄があるんですよね(汗)
例えば、敵と自機、敵と波動砲の当たり判定は別の関数で行っていますが、敵を番号で検索しながら判定を行うので、この二つのような場合は同じ関数にしてしまえば使用中の敵番号の検索が1回で済む分効率的です。
ああ、あと三角関数の値もゲームスタート前に360度分配列変数に入れて、ゲーム内では一切sin、cosの計算をさせない処理も試してみたいんだよなあ・・・。
ま、ぼちぼちやりますわ。
何はともあれ、初期段階のフォースの絵をとりあえず描いてみました。
フォースはパワーアップチップを出す敵を破壊すると出現するチップに接触する事で自機に装着されます。
当たり判定を持っていて無敵、敵弾に対してバリアの役割をしたり、射出して敵機に接触させる事でダメージを与えることが出来ます。。
また、フォースからも弾を発射する事が出来るので、射出し、自機の位置からは死角になった位置の敵機を攻撃する事も出来ます。
フォースは自機の前か後ろに装着する事が出来ます。
このアイテムはR-TYPEを他のシューティングゲームと差別化する際に最も重要なファクターです。
各ステージはこのフォースの存在を想定して設計されており、フォースをどのように使って攻略するかがR-TYPEに他のシューティングゲームに無い戦略性をもたらしていると言えるでしょう。
まずは、パワーアップチップの存在は無視して、最初からフォースを装着した状態でスタートしうまく動くように実装してみようと思います。
フォース用の構造体を作り、座標、移動用のベクトル、フォースのグレード(フォースはアイテムチップを追加取得する事でグレードアップする)、フォースの状態を表す変数を定義します。
考えられるフォースの状態を書き出してみましょう。
①自機の前に装着された状態
②自機の後ろに装着された状態
③Bボタンで射出され、何かに当たるまで直進する状態(①からなら画面右方向、②からなら画面左方向)
④③のあと、自機の動きに追従して誘導される状態
⑤③か④の状態でBボタンが押された際に、自機の方へ戻ってくる状態
こんなとこでしょうか。
これを、 Force.mode と言う変数で0~4の値で表現します。
プログラムはこの数値によって、その時のフォースのアルゴリズムを選び、動かします。
同じようにフォースのグレードを書き出すと、
①フォースの無い状態
②第一形態
③第二形態
③第三形態
となります。
これを、同じように Force.grade と言う変数で管理し、その数値によって表示するグラフィックなどをコントロールします。
その他に、攻撃方法を変更するアイテムもあるので、それを管理する変数ものちのち必要でしょう。
そこまで作るかわかりませんが・・・。
とりあえず、基本部分を実装してみますか。
ボスの攻撃を実装しました。
一定時間間隔で弾(?)を連射してきます。
画面の中心辺りを過ぎると自機方向に少し方向修正してきます。
ますますコアを狙い難くなりました。
さて、これで敵に関しては全て実装したので、一応通して遊べるものになりました。
お疲れ、俺。
これから先は、まずフォース(パワーアップアイテム)を実装しようかなと。
実は、次はアクションゲームに挑戦しようかなと漠然と考えていて、複数ステージで少しまともなゲームの体裁が整ったものを作ってみようと思っています。
オリジナルにしようと思っていますが、まだ考え中なのでどうなるか解りません。
どっちにしろ少し今までより規模の大きなゲームに挑戦することになるので、少しゲームの仕様とかプログラムの設計とか考える時間が必要です。
そういう見えない(ブログに書かない)作業を進めながら、このR-TYPEもどきを仕上げてゆこうと思っています。
なので、フォース実装も含めて当初の予定よりグラフィックなどの完成度も高めるかもしれません。
いずれドット絵の技術は必要ですしね。
と、言うわけで現状をアップしておきます。
難易度は僕には高いと感じられます。
僕の腕で、なんとかボスまで行ける時もあるって感じですな。
いつも通りZipファイルで、ソース、操作説明は同梱です。
http://multip.net/view/C5zdWgUvYx
えーと、ボスを倒しても尻尾だけ残るし、ゲームは終らないですが仕様です(笑)。
ESCで抜けてください。
あと、ミスするとスタート地点に即戻されます。
余韻なんてありませんw
さて、ここから何処までクオリティアップできるかなあ・・・。
ボスの実装 ~その3~
テストで作っていた多関節アルゴリズムで動く尻尾を、本編のプロジェクトに移植、実装完了しました。
考えていたよりかなり大変な作業になりました。
まず、テスト版よりも関節の数が倍になっています。
それに伴って各値の調整をやり直す事になりました。
このアルゴリズムは関節の数が変ると動きがまるで違ってくるからです。
また、敵機の構造体配列は当初40用意していて、それはつまり同時に40体まで敵を処理できる事を表しています。
敵が出現する際は、この配列を調べて未使用の若い番号から使用する形になっています。
で、今回この配列を56用意するようにして、0~39番を通常の敵機、40~55番をボス専用にする処理を加えました。
理由は2つあります。
まず、ボス直前の最後の敵機が多数の誘導ミサイルを撃ってくることです。
このミサイルを破壊しきれずにボスのエリアまで追っかけられてしまった場合、ボス出現に必要な構造体が足りなくなってしまう可能性があるんじゃないかと思ったんです。
2つ目の理由は、多関節の制御をするために尻尾に使う15組の構造体は連番にする必要があったからです。
以上のような変更、追加と、移植しやすさをまったく考慮していなかったテストプログラムのせいで、尻尾の実装が予想以上に大変な作業になってしまったわけです。
移植する前提でテストプログラムを作る時は、変数名やその初期化部分、重要なアルゴリズム部分などはそのままコピーできるぐらい本編に則した形で作らなきゃダメですね。
大変だった分、勉強にもなりました。
うまく動いてくれた時はかなり感動しました(涙)
ブンブン尻尾を振ってコアへの攻撃を邪魔してきます。
ゲームの難易度にも関わるので、まだまだ微調整が必要になるでしょう・・・。
- ABOUT
- カレンダー
04 | 2025/05 | 06 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 最新コメント
- プロフィール
はい。
- ブログ内検索
- カウンター
- アクセス解析