回転砲台実装 ~その7~
回転砲台実装最後の記事です。
最後に破壊後も回転砲台の残骸が残る処理と、弾を撃ってくる処理を加えようと思います。
まず、残骸を残しますか。
当然ですが残骸砲台のグラフィックデータが必要ですので、絵を描きました。
で、爆発アニメーションを描画する部分に手を加えます。
爆発アニメが終了すると敵の使用中(used)フラグを降ろして、プログラム上からその敵の存在を消す処理を行っています。
ここに条件分岐を付けて、敵が回転砲台だった場合は破壊不可能な残骸として再初期化するように書き加えます。
そして画面描画関数に新しく増えた残骸のキャラクター番号に対応した表示を行う処理を加えればOKです。

ほい、破壊後も残骸が残るようになりますた。
次に弾を撃ってくるようにしましょう。
敵弾発射関数をいじります。
自機の背景上のX座標(BGx)から円の内側に入っているか判断して、入っているなら一定確率で弾を発射する関数へとばします。
さて、これで回転砲台に必要な要素は全て実装できたんじゃないかと思います。
あとはテストプレイをしながら細かい数値を調整したり、行き当たりばったりで書いたコードを整理、最適化したりしてゆきます。
最初の難関は突破です。
ぷよのアルゴリズムの方が難易度は高かったと思います。
あくまで印象ですが。
僕がレベルアップしているだけか(爆)
次の難関は敵の発射する誘導ミサイル、そしてボスです。
フォースやパワーアップアイテムの実装もやるとなったら大変そうですね。
まあ、こつこつと。
回転砲台実装最後の記事です。
最後に破壊後も回転砲台の残骸が残る処理と、弾を撃ってくる処理を加えようと思います。
まず、残骸を残しますか。
当然ですが残骸砲台のグラフィックデータが必要ですので、絵を描きました。
で、爆発アニメーションを描画する部分に手を加えます。
爆発アニメが終了すると敵の使用中(used)フラグを降ろして、プログラム上からその敵の存在を消す処理を行っています。
ここに条件分岐を付けて、敵が回転砲台だった場合は破壊不可能な残骸として再初期化するように書き加えます。
そして画面描画関数に新しく増えた残骸のキャラクター番号に対応した表示を行う処理を加えればOKです。
ほい、破壊後も残骸が残るようになりますた。
次に弾を撃ってくるようにしましょう。
敵弾発射関数をいじります。
自機の背景上のX座標(BGx)から円の内側に入っているか判断して、入っているなら一定確率で弾を発射する関数へとばします。
さて、これで回転砲台に必要な要素は全て実装できたんじゃないかと思います。
あとはテストプレイをしながら細かい数値を調整したり、行き当たりばったりで書いたコードを整理、最適化したりしてゆきます。
最初の難関は突破です。
ぷよのアルゴリズムの方が難易度は高かったと思います。
あくまで印象ですが。
僕がレベルアップしているだけか(爆)
次の難関は敵の発射する誘導ミサイル、そしてボスです。
フォースやパワーアップアイテムの実装もやるとなったら大変そうですね。
まあ、こつこつと。
PR
回転砲台実装 ~その6~
小さい事ですが回転砲台の当たり判定を修正しました。
円の外からの攻撃を無効にするために、回転砲台の外側に破壊不可能な堅さの見えない敵を置く処理を行っていました。
この方法だと、
①無駄な当たり判定が増えてしまう
②見た目上よりも多くの敵機データを処理しなければならない
③波動砲があきらかに見えない何かに当たって消えてしまう
等のデメリットがあります。
なので何とか攻撃方向から処理をする事が出来ないかと考えていました。
で、考えていて気付きました。
回転砲台はそれぞれが現在角度をデータで持ってるじゃん!と(笑)。
自分のボケに、自分で突っ込んだ気分です。
気付けば簡単。
極めて軽い処理で実現できます。
角度が浅いとこも含めて、とりあえず70度から290度までは当たった波動砲を無効化するようにするだけです。(角度はテストプレイで今後微調整しますが・・・)
実際上手くいきました。
今のところ実装するか不明ですが、もし後方攻撃を実装したとしても、自機との座標を比較して無効化する角度を変えてやれば対応できるはずです。
これで、無駄に見えない敵を処理する必要はなくなりました。
今回ばかりは言わせてください。
俺、天才。
よくやった!
(最初から気付ければもっと良かったね。)
小さい事ですが回転砲台の当たり判定を修正しました。
円の外からの攻撃を無効にするために、回転砲台の外側に破壊不可能な堅さの見えない敵を置く処理を行っていました。
この方法だと、
①無駄な当たり判定が増えてしまう
②見た目上よりも多くの敵機データを処理しなければならない
③波動砲があきらかに見えない何かに当たって消えてしまう
等のデメリットがあります。
なので何とか攻撃方向から処理をする事が出来ないかと考えていました。
で、考えていて気付きました。
回転砲台はそれぞれが現在角度をデータで持ってるじゃん!と(笑)。
自分のボケに、自分で突っ込んだ気分です。
気付けば簡単。
極めて軽い処理で実現できます。
角度が浅いとこも含めて、とりあえず70度から290度までは当たった波動砲を無効化するようにするだけです。(角度はテストプレイで今後微調整しますが・・・)
実際上手くいきました。
今のところ実装するか不明ですが、もし後方攻撃を実装したとしても、自機との座標を比較して無効化する角度を変えてやれば対応できるはずです。
これで、無駄に見えない敵を処理する必要はなくなりました。
今回ばかりは言わせてください。
俺、天才。
よくやった!
(最初から気付ければもっと良かったね。)
回転砲台実装 ~その5~
引き続き回転砲台の実装を進めています。
今回はコアを破壊すると他の砲台が連鎖して壊れてゆく処理を作りました。
まず波動砲と敵の当たり判定の関数に、当たったキャラが回転砲台のコアの場合、回転砲台が連鎖爆発する関数へ飛ぶように命令を書き加えます。
その上で連鎖爆発の関数( GondolaDest ( void ) )を 書いてゆきます。
敵キャラは破壊されるとDest_Timeと言う変数に破壊された時間が記録されます。
画面描画関数はこの変数に0以外が入っていた場合、本来表示するキャラ番号を無視して爆発アニメーションを表示するようになっています。
爆発アニメーションは現在時刻と変数に入った時刻を比較して進行し、終るとそのキャラの有効フラグが降りて敵はプログラム上存在しなくなるわけです。
で、連鎖爆発させる関数はこのシステムを利用します。
コアが破壊された場合、回転砲台のコアよりの端から数十ミリ秒ずつ未来の時刻をDest_Timeに入れてゆくのです。

たったこれだけで、ドカン、ドカン、ドカンと端から爆発させる事が出来ます。
あとは画面描画関数を少し書き換える必要があります。
Dest_Timeが0ならキャラ表示、0以外なら現在時刻との差を求めて爆発アニメーションとなっているため、未来の時刻だとキャラも爆発も表示されなくなります。
つまり、コアを破壊した瞬間全ての砲台が画面から消え、少し遅れて爆発のアニメーションだけが表示されてしまうわけです。
そこで、変数が0か未来の時刻ならキャラ表示、そうじゃなければ爆発アニメって感じに分岐を変えてやれば理想通りに爆発する直前まで各砲台は表示されるようになります。

花火のようにきれいにグルリと円を描いて爆発してゆきます。
ちょっと感動・・・(涙)
引き続き回転砲台の実装を進めています。
今回はコアを破壊すると他の砲台が連鎖して壊れてゆく処理を作りました。
まず波動砲と敵の当たり判定の関数に、当たったキャラが回転砲台のコアの場合、回転砲台が連鎖爆発する関数へ飛ぶように命令を書き加えます。
その上で連鎖爆発の関数( GondolaDest ( void ) )を 書いてゆきます。
敵キャラは破壊されるとDest_Timeと言う変数に破壊された時間が記録されます。
画面描画関数はこの変数に0以外が入っていた場合、本来表示するキャラ番号を無視して爆発アニメーションを表示するようになっています。
爆発アニメーションは現在時刻と変数に入った時刻を比較して進行し、終るとそのキャラの有効フラグが降りて敵はプログラム上存在しなくなるわけです。
で、連鎖爆発させる関数はこのシステムを利用します。
コアが破壊された場合、回転砲台のコアよりの端から数十ミリ秒ずつ未来の時刻をDest_Timeに入れてゆくのです。
たったこれだけで、ドカン、ドカン、ドカンと端から爆発させる事が出来ます。
あとは画面描画関数を少し書き換える必要があります。
Dest_Timeが0ならキャラ表示、0以外なら現在時刻との差を求めて爆発アニメーションとなっているため、未来の時刻だとキャラも爆発も表示されなくなります。
つまり、コアを破壊した瞬間全ての砲台が画面から消え、少し遅れて爆発のアニメーションだけが表示されてしまうわけです。
そこで、変数が0か未来の時刻ならキャラ表示、そうじゃなければ爆発アニメって感じに分岐を変えてやれば理想通りに爆発する直前まで各砲台は表示されるようになります。
花火のようにきれいにグルリと円を描いて爆発してゆきます。
ちょっと感動・・・(涙)
回転砲台実装 ~その4~
それでは複数の回転砲台をズラーっとCの字に並べてみましょうか。
何度か試した結果、19度ずつずらして16機の砲台を表示することにしました。
回転方向の先頭から数えて12番目にコアを表示します。
相変わらずの手抜き絵ですがコアの絵も描きました。
プログラム的には難しい事は何もしていません。
回転砲台の初期化(出現)関数を16機分のループにして、変数sita の値をループごとに19足してやるだけです。
で、12機めはキャラ番号をコアの数字にします。
これだけじゃ何なんで、ついでに回転砲台の外側にもう一層見えない敵を出現させました。
回転砲台より円運動の半径と、当たり判定を大きくしてあります。
こっちを破壊不可能な堅さにし、回転砲台自体は破壊可能な堅さに設定しました。
これで、円の外側からはいくら攻撃しても回転砲台を破壊する事は出来ません。

上半分が回転砲台、
下半分が外側の見えない壁を出現させる処理です。
ちなみに前の記事までのだと回転速度が速すぎたので角速度を半分にしました。
1フレームに0.5度回転します。
さあ、うまくいくかな?
あ、絵も線だけじゃアレだったんで、色つけて少しだけマシにしました(笑)

どーだ!!
完璧・・・。
ああ、僕にはR-TYPEの回転砲台にしか見えない・・・。
しかし、まだまだやる事は残っています。
砲台なのに、まだ弾撃ってこないし。
コアを破壊しても連鎖して爆発しないし。
あと、壊すと消えちゃいます。
実際は残骸が残ってCの字は破壊後も残らなければなりません。
ひとつひとつ、じっくりと、確実に実装してゆきましょう。
それでは複数の回転砲台をズラーっと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 ) ;
さて、うまく動くかな・・・。
おお、向きが変ってる!
ちゃんと中心方向を向いてますよォ!
せっかく記事を分けてやってるんだけども、はたして解りやすく説明できているのだろうか・・・。
まあ、気にしないよ。
次はズラーっとね、複数の砲台を表示してみようと思っております。はい。
- 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
職業:
スロ屋店員
趣味:
いろいろ
自己紹介:
やる気だけはあるつもりです。
はい。
はい。
- ブログ内検索
- カウンター
- アクセス解析