誘導ミサイルを撃ってくるロボットの動きのアルゴリズムが出来ました。
画面中ほどの高さで右へ飛行し、着地します。
出現時からのフレーム数でベクトルの値を変えてゆき、着地の時のみ地面との当たり判定で状態移行させています。
プログラムはこんな感じ。

数式で動かすタイプに比べると単純なアルゴリズムです。
しかし、状態を移行するタイミングを調整するために、トリガーになるフレーム数を変えながらテストを重ねる必要があるため、プログラムが単純なわりに思ったように動かすためには時間がかかります。

飛んで、飛んで、飛んで・・・

スタッと、着地します。
さて、次は一定時間間隔で誘導ミサイルを発射するようにしてみましょう。
ぜんぜん関係ないんですが、メインのシステム部分にも少し改良を加えました。
まず、スクロール部分で背景の画像のX座標を毎フレーム-1する処理をしていたんですが、ゲームがスタートしてからのフレーム数を使う形にしました。
背景のX座標 = -ゲームフレーム
となります。
それにあわせて、メインループに入る前の初期化やファイルの読み込みなんかをやっている部分に、現在のゲームフレームの値から最初に出現する事になる敵がスケジュールファイルの中の何番目の敵かを検索するプログラムを加えました。
なぜこんな改造をしたかというと、ゲーム制作が後半部分に入ってきてテストプレイに時間がかかるようになったからです。
チェックしたいお目当ての部分にたどり着くまで、数値を僅かに変えた結果を見たいだけなのに最初からプレイするのはあまりにめんどくさいです。
今回の改造によって、ゲームフレームを入れる変数の初期化部分に任意のフレーム数を書いておけば、途中からゲームをスタートできるようになりました。
いやあ、もっと早く実装しとけば良かった・・・。
テストプレイがメチャメチャ楽になりました(笑)
また、この実装は後々、自機がやられた時の再スタート処理にも役立つでしょう。
あと、アニメーション関数も少し書き換えました。
関数に渡したパラメーターによってキャラの左右反転を可能にするため、DrawRotaGraph関数を使っていましたが、この関数を使うと(もともと画像を拡大縮小・回転表示する関数のため)表示位置を指定する座標は画像の中心点となります。
全てのキャラが一定の画像サイズなら問題ないんですが、画像サイズの異なるキャラがいる場合、中心点を求めるために座標に足す数値が変ってくるため、やっかいです。
じっさい今回のロボットを実装する時もこの関数のせいで思った位置に調整するのに苦労させられました。
今回のゲームでは拡大や回転の必要はなく、ただ左右反転は使いたかっただけなので、DrawTurnGraph関数を使う形にしました。
呼び出し側から渡されたフラグがFALSEなら普通にDrawGraph関数で、TRUEならDrawTurnGraph関数で表示を行うように条件分岐させます。
これで、ここまでに既に書いてしまっているアニメーション関数の呼び出しは一切変更する必要無く、画像サイズを気にせずにすむようになりました。
あと、もうひとつ改良したいところがあるんだよなあ・・・。
固定FPSでゲームを進行しているのに、時間の関係する処理ごとにGetNowCount関数を使うのはナンセンスなんです。
フレーム数をタイマーとして使う方が処理も軽いし合理的です。
GetNouCount関数は1フレームの時間を管理する部分にだけ使えばよいので、1フレーム1回使えば済む話じゃないかと。
なんで最初に気付かなかったのか・・・(悲)。
まあ、今時点で処理が重くて困っているわけでもないんで、このまま行くかも知れません。
画面中ほどの高さで右へ飛行し、着地します。
出現時からのフレーム数でベクトルの値を変えてゆき、着地の時のみ地面との当たり判定で状態移行させています。
プログラムはこんな感じ。
数式で動かすタイプに比べると単純なアルゴリズムです。
しかし、状態を移行するタイミングを調整するために、トリガーになるフレーム数を変えながらテストを重ねる必要があるため、プログラムが単純なわりに思ったように動かすためには時間がかかります。
飛んで、飛んで、飛んで・・・
スタッと、着地します。
さて、次は一定時間間隔で誘導ミサイルを発射するようにしてみましょう。
ぜんぜん関係ないんですが、メインのシステム部分にも少し改良を加えました。
まず、スクロール部分で背景の画像のX座標を毎フレーム-1する処理をしていたんですが、ゲームがスタートしてからのフレーム数を使う形にしました。
背景のX座標 = -ゲームフレーム
となります。
それにあわせて、メインループに入る前の初期化やファイルの読み込みなんかをやっている部分に、現在のゲームフレームの値から最初に出現する事になる敵がスケジュールファイルの中の何番目の敵かを検索するプログラムを加えました。
なぜこんな改造をしたかというと、ゲーム制作が後半部分に入ってきてテストプレイに時間がかかるようになったからです。
チェックしたいお目当ての部分にたどり着くまで、数値を僅かに変えた結果を見たいだけなのに最初からプレイするのはあまりにめんどくさいです。
今回の改造によって、ゲームフレームを入れる変数の初期化部分に任意のフレーム数を書いておけば、途中からゲームをスタートできるようになりました。
いやあ、もっと早く実装しとけば良かった・・・。
テストプレイがメチャメチャ楽になりました(笑)
また、この実装は後々、自機がやられた時の再スタート処理にも役立つでしょう。
あと、アニメーション関数も少し書き換えました。
関数に渡したパラメーターによってキャラの左右反転を可能にするため、DrawRotaGraph関数を使っていましたが、この関数を使うと(もともと画像を拡大縮小・回転表示する関数のため)表示位置を指定する座標は画像の中心点となります。
全てのキャラが一定の画像サイズなら問題ないんですが、画像サイズの異なるキャラがいる場合、中心点を求めるために座標に足す数値が変ってくるため、やっかいです。
じっさい今回のロボットを実装する時もこの関数のせいで思った位置に調整するのに苦労させられました。
今回のゲームでは拡大や回転の必要はなく、ただ左右反転は使いたかっただけなので、DrawTurnGraph関数を使う形にしました。
呼び出し側から渡されたフラグがFALSEなら普通にDrawGraph関数で、TRUEならDrawTurnGraph関数で表示を行うように条件分岐させます。
これで、ここまでに既に書いてしまっているアニメーション関数の呼び出しは一切変更する必要無く、画像サイズを気にせずにすむようになりました。
あと、もうひとつ改良したいところがあるんだよなあ・・・。
固定FPSでゲームを進行しているのに、時間の関係する処理ごとにGetNowCount関数を使うのはナンセンスなんです。
フレーム数をタイマーとして使う方が処理も軽いし合理的です。
GetNouCount関数は1フレームの時間を管理する部分にだけ使えばよいので、1フレーム1回使えば済む話じゃないかと。
なんで最初に気付かなかったのか・・・(悲)。
まあ、今時点で処理が重くて困っているわけでもないんで、このまま行くかも知れません。
PR
この記事にコメントする
- 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 |
- 最新コメント
[11/09 CALL MY NAME]
[11/09 erin]
[08/18 うずランド]
[07/11 うずランド]
[06/23 うずランド]
- プロフィール
HN:
Call my name
年齢:
50
性別:
男性
誕生日:
1974/05/22
職業:
スロ屋店員
趣味:
いろいろ
自己紹介:
やる気だけはあるつもりです。
はい。
はい。
- ブログ内検索
- カウンター
- アクセス解析