管理人様やここの方たちのお陰でなんとか東方に近いシューティングゲームができ、
今度はステージや敵追加のためデータを外部読み込みにしたりと
プログラムを効率が良いように書き換えているのですが
ちょっと以前のプログラムだとボスの考え方の部分があまりに力技過ぎたので質問させてください
ボスはHPに応じて弾幕が変わるのですがその移行部分を皆さんはどのようにやっているのでしょうか
私はボスのHPを例えば1000とすると1000~800の間は1のパターンなどとやっていました
しかしこれだとHPが800になった瞬間にとあるエフェクトを出したいが弾が複数当たるなどして
スキップされてしまったりなど色々不便で…
またHPの表示もそれぞれの部分で設定してやらねばならず非常にプログラムが効率悪くなってしまいました
HPをそれぞれの弾幕に応じて設定してやればいいのではと思いましたが
ボスを普通の敵と同じ構造体で扱っているためHPが0になると消滅してしまい…w
ボスの出現フラグを2などとしてみるなどすればいいのでしょうが…
と少しわかりにくいかもしれませんがどなたか御願いします
STGのボスの考え方について
Re:STGのボスの考え方について
シューティングは作った事がないので、適当なことを言うかもしれませんが…
>>しかしこれだとHPが800になった瞬間にとあるエフェクトを出したいが弾が複数当たるなどして
スキップされてしまったりなど色々不便で…
これを解消したいならば、HPが800になった瞬間にボスを無敵状態にしてしまって、エフェクトが終了次第、無敵状態を解除すればいいのではないでしょうか?
>>しかしこれだとHPが800になった瞬間にとあるエフェクトを出したいが弾が複数当たるなどして
スキップされてしまったりなど色々不便で…
これを解消したいならば、HPが800になった瞬間にボスを無敵状態にしてしまって、エフェクトが終了次第、無敵状態を解除すればいいのではないでしょうか?
Re:STGのボスの考え方について
状態遷移の考え方をすればいいんですよ。 ボスの初期状態を0としましょう。 状態0のままHPは段々減少していきます。 そして今800に差し掛かったとしましょう。 if(状態==0 && boss.hp<800){ エフェクト発動; 状態=1; } こうすればスキップされません。 さらに400以下になったときにまたエフェクトをかけたければ if(状態==1 && boss.hp<400){ エフェクト発動; 状態=2; } こんな感じでしょう。 大ボスが第二形態に変身したりするようなエフェクトなら バグさんの仰る方法がいいかもしれませんし、 もし東方風にやるなら状態遷移でしょう。 >またHPの表示もそれぞれの部分で設定して >やらねばならず非常にプログラムが効率悪くなってしまいました HPの表示を設定するとはどういうことでしょうか? HPの表示は描画部のボス担当部分でやればいいだけだと思います。 >HPをそれぞれの弾幕に応じて設定してやればいいのではと思いましたが >ボスを普通の敵と同じ構造体で扱っているためHPが0になると消滅してしまい…w >ボスの出現フラグを2などとしてみるなどすればいいのでしょうが… 実は私もボスの構造体と雑魚の構造体は同じ物を使っています。 弾の量は違いますが、そこはベクターでどうにでも増えますし。 構造が同じなら同じ関数で処理できるのでこちらの方が楽なんですよね。 私は雑魚が死んだ状態で雑魚が発射した弾がまだ残っている時は2のフラグを 使っているのでボスは10にしました。 まぁその辺どうでもいいですが。 別にフラグが10の時は0になっても規定回数復活するようにすればいいと思いますよ。
Re:STGのボスの考え方について
実は状態遷移って裏ワザのキーによく使います。
私が今まで作ったゲームにも公開していないだけで結構そういう裏ワザキーが設定されています。
なぜかと言うとリリースしたゲームそのものでデバッグできるからです^^;
大きな声でいえないので小さな声で言いますが
一応私にしかわからないキーを押せば違う面にとんだり、ボスが一瞬で倒せたり、パワーがマックスになったり0になったりします。
・・と言うのもデバッグ時に設定した機能を消してリリースしたら何かしらそこが影響して何か変ってしまうかもしれないからです。
リリースしたゲームそのものでバグチェックすれば、そこでバグが出なければ少なくともチェックしたバグは出るはずが無いですからw
そこで、例えばゲーム中に「debug」と入力したらデバッグモードになるとします。(龍神録ではなりませんよw)
分りやすく言えば
私が今まで作ったゲームにも公開していないだけで結構そういう裏ワザキーが設定されています。
なぜかと言うとリリースしたゲームそのものでデバッグできるからです^^;
大きな声でいえないので小さな声で言いますが
一応私にしかわからないキーを押せば違う面にとんだり、ボスが一瞬で倒せたり、パワーがマックスになったり0になったりします。
・・と言うのもデバッグ時に設定した機能を消してリリースしたら何かしらそこが影響して何か変ってしまうかもしれないからです。
リリースしたゲームそのものでバグチェックすれば、そこでバグが出なければ少なくともチェックしたバグは出るはずが無いですからw
そこで、例えばゲーム中に「debug」と入力したらデバッグモードになるとします。(龍神録ではなりませんよw)
分りやすく言えば
if (状態==0 && key[KEY_INPUT_D]==2) 状態=1; else if(状態==1 && key[KEY_INPUT_E]==2) 状態=2; else if(状態==2 && key[KEY_INPUT_B]==2) 状態=3; else if(状態==3 && key[KEY_INPUT_[/url]==2) 状態=4; else if(状態==4 && key[KEY_INPUT_G]==2) 状態=5; else if(他のキー入力があった) 状態=0; if(状態==5){ デバッグモード発動; 状態=0; } こんな感じで状態が5になればデバッグモード発動です。 昔ストツーとかで 上R下LYBXAとかで裏ワザやったと思いますが、そういうのも状態遷移ではないでしょうか。
Re:STGのボスの考え方について
バグ様、管理人様、素早い御回答ありがとうございます
なるほど、状態遷移ですか
これを参考にやらせていただきます
プログラムって作り直すたびに昔の自分の効率の悪さに苦笑してしまう…w
しかし面白そうな例ですねw
これも参考にさせていただきます
なるほど、状態遷移ですか
これを参考にやらせていただきます
プログラムって作り直すたびに昔の自分の効率の悪さに苦笑してしまう…w
しかし面白そうな例ですねw
これも参考にさせていただきます
Re:STGのボスの考え方について
状態を作ると必ず初期化ミスが付きまとうので、何か一つの構造体に当てはめておいて、
memsetでいつも初期化することを忘れないようにして下さい。
>プログラムって作り直すたびに昔の自分の効率の悪さに苦笑してしまう…w
普通にみんなそうじゃないですかね^^;
多分昔からプログラムをやってる人や熟練者ではない限り、みんなプログラムを書くこと自体毎日勉強なんだと思いますm(_ _)m
memsetでいつも初期化することを忘れないようにして下さい。
>プログラムって作り直すたびに昔の自分の効率の悪さに苦笑してしまう…w
普通にみんなそうじゃないですかね^^;
多分昔からプログラムをやってる人や熟練者ではない限り、みんなプログラムを書くこと自体毎日勉強なんだと思いますm(_ _)m
Re:STGのボスの考え方について
いっそのこと、構造体ではなくクラスにしてはいかがでしょうか?
コンストラクタで初期化しておいて、あとは初期化用のメンバ関数を準備しておいたら便利かな?
コンストラクタで初期化しておいて、あとは初期化用のメンバ関数を準備しておいたら便利かな?
Re:STGのボスの考え方について
バグ様提案有難うございます
私もグローバル変数が多すぎるのでクラスを利用したいと思っているのですが
中々理解できず苦戦しております…w
ネットや図書館を利用してクラスについて現在学んでいますがこれが中々…
私もグローバル変数が多すぎるのでクラスを利用したいと思っているのですが
中々理解できず苦戦しております…w
ネットや図書館を利用してクラスについて現在学んでいますがこれが中々…
Re:STGのボスの考え方について
と、もう少しだけ質問させていただいて宜しいでしょうか
ボスの移動についてなのですが
特定座標へ移動するというのなら楽なのですが例えば
特定の周期でランダムな位置(ただしプレイヤーのいるx方向へかつ画面上部維持)、に移動する
といった動きを実現するにはどうすればいいでしょうか
と、ちょっとわかりにくいですね…
今無理やりやっている方法は
といった感じなのですが
問題としては一定速度では移動しない、無駄が多い?でしょうか…
ブレーキをかけるようにストップするのはこれだと楽なのですが…
ボスの移動についてなのですが
特定座標へ移動するというのなら楽なのですが例えば
特定の周期でランダムな位置(ただしプレイヤーのいるx方向へかつ画面上部維持)、に移動する
といった動きを実現するにはどうすればいいでしょうか
と、ちょっとわかりにくいですね…
今無理やりやっている方法は
if(enemy.counter%180==0){//180カウントに一回移動する角度を決める if(Player.x-enemy.x>0&&enemy.y<160&&enemy.x<340) enemy.angle=atan2(GetRand(5),GetRand(10));//右下へ移動 if(Player.x-enemy.x<0&&enemy.y<160&&enemy.x>100) enemy.angle=atan2(GetRand(5),-GetRand(10));//左下へ移動 if(Player.x-enemy.x>0&&enemy[i].y>160&&enemy[i].x<340) enemy[i].angle=atan2(-GetRand(5),GetRand(10));//右上へ移動 if(Player.x-enemy[i].x<0&&enemy[i].y>160&&enemy[i].x>100) enemy[i].angle=atan2(-GetRand(5),-GetRand(10));//左上へ移動 } if(enemy[i].counter%180<60){//180カウントの内、60カウント間移動 enemy[i].x+=3.0f*cos(enemy[i].angle); enemy[i].y+=3.0f*sin(enemy[i].angle); }
といった感じなのですが
問題としては一定速度では移動しない、無駄が多い?でしょうか…
ブレーキをかけるようにストップするのはこれだと楽なのですが…
Re:STGのボスの考え方について
enemy構造体に「目標到達地点」なる変数を設定し、そこに向かって移動させたらいいのではないでしょうか?
そうしたら決まった範囲内を移動させるのも楽ではないでしょうか。
10,10 ~ 300,100の座標内を移動させたければすぐそう出来ますし。
そうしたら決まった範囲内を移動させるのも楽ではないでしょうか。
10,10 ~ 300,100の座標内を移動させたければすぐそう出来ますし。
Re:STGのボスの考え方について
お返事遅くなってしまい申し訳ないです
管理人様のおっしゃったようにやって上手くいきました
移動させたい座標と敵番号を送って移動してやる関数を別に作ってやると便利でした
お忙しいところ有難うございました
管理人様のおっしゃったようにやって上手くいきました
移動させたい座標と敵番号を送って移動してやる関数を別に作ってやると便利でした
お忙しいところ有難うございました