引き続き回転砲台の実装を進めています。
今回はコアを破壊すると他の砲台が連鎖して壊れてゆく処理を作りました。
まず波動砲と敵の当たり判定の関数に、当たったキャラが回転砲台のコアの場合、回転砲台が連鎖爆発する関数へ飛ぶように命令を書き加えます。
その上で連鎖爆発の関数( GondolaDest ( void ) )を 書いてゆきます。
敵キャラは破壊されるとDest_Timeと言う変数に破壊された時間が記録されます。
画面描画関数はこの変数に0以外が入っていた場合、本来表示するキャラ番号を無視して爆発アニメーションを表示するようになっています。
爆発アニメーションは現在時刻と変数に入った時刻を比較して進行し、終るとそのキャラの有効フラグが降りて敵はプログラム上存在しなくなるわけです。
で、連鎖爆発させる関数はこのシステムを利用します。
コアが破壊された場合、回転砲台のコアよりの端から数十ミリ秒ずつ未来の時刻をDest_Timeに入れてゆくのです。
たったこれだけで、ドカン、ドカン、ドカンと端から爆発させる事が出来ます。
あとは画面描画関数を少し書き換える必要があります。
Dest_Timeが0ならキャラ表示、0以外なら現在時刻との差を求めて爆発アニメーションとなっているため、未来の時刻だとキャラも爆発も表示されなくなります。
つまり、コアを破壊した瞬間全ての砲台が画面から消え、少し遅れて爆発のアニメーションだけが表示されてしまうわけです。
そこで、変数が0か未来の時刻ならキャラ表示、そうじゃなければ爆発アニメって感じに分岐を変えてやれば理想通りに爆発する直前まで各砲台は表示されるようになります。
花火のようにきれいにグルリと円を描いて爆発してゆきます。
ちょっと感動・・・(涙)
それでは複数の回転砲台をズラーっとCの字に並べてみましょうか。
何度か試した結果、19度ずつずらして16機の砲台を表示することにしました。
回転方向の先頭から数えて12番目にコアを表示します。
相変わらずの手抜き絵ですがコアの絵も描きました。
プログラム的には難しい事は何もしていません。
回転砲台の初期化(出現)関数を16機分のループにして、変数sita の値をループごとに19足してやるだけです。
で、12機めはキャラ番号をコアの数字にします。
これだけじゃ何なんで、ついでに回転砲台の外側にもう一層見えない敵を出現させました。
回転砲台より円運動の半径と、当たり判定を大きくしてあります。
こっちを破壊不可能な堅さにし、回転砲台自体は破壊可能な堅さに設定しました。
これで、円の外側からはいくら攻撃しても回転砲台を破壊する事は出来ません。
上半分が回転砲台、
下半分が外側の見えない壁を出現させる処理です。
ちなみに前の記事までのだと回転速度が速すぎたので角速度を半分にしました。
1フレームに0.5度回転します。
さあ、うまくいくかな?
あ、絵も線だけじゃアレだったんで、色つけて少しだけマシにしました(笑)
どーだ!!
完璧・・・。
ああ、僕にはR-TYPEの回転砲台にしか見えない・・・。
しかし、まだまだやる事は残っています。
砲台なのに、まだ弾撃ってこないし。
コアを破壊しても連鎖して爆発しないし。
あと、壊すと消えちゃいます。
実際は残骸が残ってCの字は破壊後も残らなければなりません。
ひとつひとつ、じっくりと、確実に実装してゆきましょう。
回転砲台実装 ~その3~
熱帯夜にPC熱で、部屋は蒸し風呂のようです。
汗が滴り落ちるなか、黙々とプログラミングに励んでおります。
では予告どおり回転砲台の向きを常に中心に(実際は8方向)向けてみましょう。
各敵は、その敵ごとに自由に使える変数free を持っています。
今回はここに砲台の向きに対応するグラフィックハンドルの番号を入れてやります。
具体的には、円運動の関数に下の画像ののような処理を加えてやります。
if 文を使って、角度ごと(360/8で45度ごと)にグラフィックハンドルを指定してやるわけです。
簡単ですね。
おお、しかも無駄だと思っていた1周したら360度に戻す処理が役立った!
かなり、棚ボタです・・・(笑)
あとは、画面描画関数の砲台表示部分を下のように書き換えます。
DrawGraph ( Teki [ i ] . x, Teki [ i ] . y, TekiGH [ 8 ] [ Teki [ i ] . free ], TRUE ) ;
さて、うまく動くかな・・・。
おお、向きが変ってる!
ちゃんと中心方向を向いてますよォ!
せっかく記事を分けてやってるんだけども、はたして解りやすく説明できているのだろうか・・・。
まあ、気にしないよ。
次はズラーっとね、複数の砲台を表示してみようと思っております。はい。
回転砲台実装 ~その2~
では、回転運動する砲台をプログラムしてみます。
まず、この敵に関しては今までの敵のようにスケジュールに書き込んで出現させる形はとりません。
なぜかというと、共通の中心点によって位置の決まる複数の砲台を一発で出現させるからです。
ステージに1度限りのこの砲台のためにスケジュールデータに新しいデータ枠を追加するのは、読み込みや敵データの初期化など沢山の関数を書き換えなければならないため効率が悪いです。
出現するタイミングになったらメインループから呼び出して全砲台をいっきに初期化する(出現させる)方法を選びました。
特別イベント的な扱いです。
メインループに特定のフレーム数に到達したら、回転砲台初期化関数を呼び出す処理を加えました。
次に全砲台共通で使う、回転運動の中心点の変数を構造体にして宣言します。
中身は、中心座標 X、Yと、現在回転砲台は有効かどうかを表すusedフラグです。
回転砲台が現れたらフラグは有効(TRUE)になり、その間中心座標はスクロールに合わせて左へ移動します。
画面に砲台が入らない位置まで移動したら無効(FALSE)になります。
次に、回転砲台を初期化する(出現させる)関数を書きます。
とりあえず一機のみ表示してみる形ですが、今後少しずつ角度をずらして複数の砲台をここでまとめて出現させる事になります。
今はとりあえず破壊不可能にするため、堅さ(def)を大きめにとっています。
シータスピードを1にしているので、1フレームに1度ずつ回転することになります。
さあ、次はいよいよ円運動の実装です。
と、おおげさに言ってみましたが円周の座標を求める方法を理解していれば、超シンプルな関数で実装できます。
円運動のパターン番号は10なので、変数MovePat が10の敵機は1フレームに1回この関数に飛ばされます。
最初、角度をプラスしていったら、思っていたのと逆に回ってビビッタのは内緒です(笑)
一般的な数学の座標と画面の座標はY方向に反転しているので、たまにこのような現象に驚かされます。
この記事を書いていて気付きましたが、角度が0になったら360にする処理は無駄ですな(汗)
まあ、細かい事は気にせず・・・。
円運動を実現する関数はたったこれだけの処理で実装できます。
ここにあった砲台が回転して・・・
ここにきます。
動画じゃないとわかりずらいですが、ちゃんと回転しています。
あとは動きを見ながら中心の位置や半径を少しずつ調整して、ここにアップしたようなコードになるわけです。
さあ、次は砲台が常に円の中心方向を向くようにしましょうか!
うわー!今、思い出した!
コアの存在を!
絵、描いてねえし・・・orz
一日の制作時間が大きく取れない中なので、少しずつ実装を進めたいと思います。
いままで、ひとつひとつの敵機の実装過程を細かく書いてこなかったので、ちょうど良いかなと。
ここまでのプログラムで敵の動きは10種類ほど実装してきました。
そのなかで自分なりに手順のテンプレートのようなものも現れてきたので、それにそって実装を進めたいと思います。
まず、今日は素材を用意します。
素材とはここでは絵のことです。
動きをプログラムした際に試しながら少しずつ数値を修正してゆくわけですが、その時に表示する絵がないとテストできません。
なので、僕は最初に面倒な素材作りをやってしまいます。
はっきり言ってテストするだけなら今までに描いてきたキャラを取り合えず代用しても良いのですが、いちおう動きにあった絵が欲しくなるのは単に僕の性分です。
変なこだわりのわりに絵自体は手抜き全開ですが(笑)
まずは背景を回転砲台まで描き進めます。
画面の円の部分が回転砲台になるイメージですな。
背景はとりあえず今までのパーツの流用です。
ここで問題が。
いままで背景を描くのにもドット絵エディタのEDGEを使っていたんですが、扱える画像サイズの限界横幅4000ピクセルを超えてしまいました。
そこでもう一本、普段趣味で絵を描く際に使っていたフリーソフトのPixiaを使ってみました。
画像サイズは今のところ問題なさそうです。
ドット絵を描くのには向かないソフトですが、背景はほぼ素材チップのコピー&ペーストで作っているのでこのソフトでも問題ありません。
この制作プロジェクトの途中で気付いたんですが、いくつかの素材チップを並べてマップを作るなら、プログラム的には一枚絵としての背景じゃなくても良かったですね。
素材チップひとつひとつをグラフィックハンドルに入れて、何時何処に表示するかを外部ファイルから読み込む形にした方がデータも小さくなります。
敵機の出現管理とやる事は一緒なので、実装はそんなに難しくないはずです。
ただ、制作途中はマップの全体像をすぐにツール上で確認でき、当たり判定の座標点も探しやすいんので、1枚絵もそれはそれで便利だったりします。
とりあえず、マップが完成するまで1枚絵で描いて、その後チップを順次表示してゆくプログラムを実装するのが良さそうです。
もしかしたら、このチャレンジの最後の方でやるかもしれません。
はい、次は回転砲台のドット絵です。
超がつく適当ぶりですが、こんなんでも絵が無いと動かせないのでいいんです!(きっぱり)
そもそも、ぷよのときにも繰り返し言いましたが見た目にこだわるつもりはあまり無いんです。
あくまで、シューティングゲームとして遊べるプログラムを1面分完成させるのが目標なので。
ゲームプログラミングの基本の基本を学びたくて名作をお手本として真似(音楽で言う耳コピー?)ていますが、所詮他人の作ったゲームなんで絵なんか作り込んでも意味が無いだろうと。
絵にこりだすと凄く時間がかかるので、今は時間が勿体無いです。
絵をきっちり描きたい気持ちはいつか作るオリジナルゲームまでとっておきます。
まあね、本気だしてもあんま変らんかもしれませんが・・・(汗)
さあ、素材も出来たし次はプログラムだ!!
とりあえず砲台ひとつで円運動させる実験でもしてみます。
- 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 |
- 最新コメント
- プロフィール
はい。
- ブログ内検索
- カウンター
- アクセス解析