ページ 1 / 1
敵のショットの追加
Posted: 2015年11月09日(月) 01:54
by study15
プログラミング初心者です。
シューティングゲームの作成をしています。
できるだけ他のファイルからグローバル変数を変更できないファイル分割を考えています。
今行いたいことは、敵のショットの追加をしたいです。
Game.cpp(新ゲームプログラミングの館にある「メニュー画面の作り方」を参考にしています)
► スポイラーを表示
コード:
//ゲーム画面
#include "Game.h"
#include "SceneMgr.h"
#include "DxLib.h"
#include "char.h" //プレイヤー
#include "board.h" //ボード
#include "enemy.h" //敵
#include "graph_back.h" //背景
#include "cshot.h" //自機ショット
//初期化
void Game_Initialize(){
graph_back_Initialize();
enemy_Initialize();
char_Initialize();
board_Initialize();
cshot_Initialize();
}
//終了処理
void Game_Finalize(){
graph_back_Finalize();
enemy_Finalize();
char_Finalize();
board_Finalize();
cshot_Finalize();
}
//更新
void Game_Update(){
const ch_t *Char=char_GetChar(); //プレイヤー情報
graph_back_Update();
enemy_Update();
char_Update();
board_Update();
cshot_Update(Char);
if(CheckHitKey(KEY_INPUT_ESCAPE)!=0){ //Escキーが押されていたら
SceneMgr_ChangeScene(eScene_Menu);//シーンをメニューに変更
}
}
//描画
void Game_Draw(){
graph_back_Draw(); //背景
enemy_Draw(); //敵
cshot_Draw(); //自機ショット
char_Draw(); //プレイヤー
board_Draw(); //ボード
DrawString(0, 0,"ゲーム画面です。",GetColor(255,255,255));
DrawString(0,20,"Escキーを押すとメニュー画面に戻ります。",GetColor(255,255,255));
}
Game.cppに
龍神録プログラミングの館の敵のショットをもとに追加をしたいのですが、
敵のショットを行う関数に敵の情報をどのよう渡し、
敵のショットを行う関数はどのように書けばよろしいでしょうか?
Re: 敵のショットの追加
Posted: 2015年11月09日(月) 13:52
by softya(ソフト屋)
敵のショットモジュールが敵の弾を発生するためには、何が必要かまず考えてみましょう。
Re: 敵のショットの追加
Posted: 2015年11月09日(月) 15:36
by study15
敵のショットを行う為に
- 敵ショットの初期化
- 敵ショットの登録(弾幕の登録)
- 敵ショットの計算(弾幕の計算)
- 敵ショットのパターン(弾幕データ)
- 敵ショットの描画
- 敵の情報(フラグ、位置、弾幕開始時間、弾幕の種類、弾の種類、色)
- プレイヤーの位置情報
が必要だと考えています。
Re: 敵のショットの追加
Posted: 2015年11月09日(月) 15:53
by softya(ソフト屋)
study15 さんが書きました:敵のショットを行う為に
- 敵ショットの初期化
- 敵ショットの登録(弾幕の登録)
- 敵ショットの計算(弾幕の計算)
- 敵ショットのパターン(弾幕データ)
- 敵ショットの描画
- 敵の情報(フラグ、位置、弾幕開始時間、弾幕の種類、弾の種類、色)
- プレイヤーの位置情報
が必要だと考えています。
これだと外部との情報のインターフェイスが必要なものと、敵ショットモジュール内部で情報が閉じているものが分離されていませんので分けて下さい。
質問の内容は外部(敵処理など)から敵ショットを呼び出すときに必要なインターフェイスとは?ですよね。
それと敵の情報(フラグ、位置、弾幕開始時間、弾幕の種類、弾の種類、色)が整理されてませんね。
そんなに必要ですか? 例えば、弾幕開始時間は弾が管理するのですか?
Re: 敵のショットの追加
Posted: 2015年11月09日(月) 18:02
by study15
外部との情報のやりとりが必要なものは、
- 敵ショットの計算(弾幕の計算)
- 敵ショットのパターン(弾幕データ)
敵の情報で必要なものは、フラグ、位置、弾幕の種類
でしょうか。
敵ショットの登録がよくわからないです。
Re: 敵のショットの追加
Posted: 2015年11月09日(月) 19:05
by softya(ソフト屋)
じゅあ、こう考えてみましょう。
外部と情報がやり取りが必要なのは、内部にその情報を持っていないからです。
逆に外部とやり取りのひつようのない情報は随時外部(初期化を除く)から貰ってはいけません。
敵のショット処理は、内部に何の情報を保持、外部から何の情報を必要とするでしょうか?
外部から貰う情報は、それぞれなぜ外部から貰うう必要があるか理由も書いて下さい。
>敵ショットの登録がよくわからないです。
それは外部内部関係なしに、単純な弾も発生させ方が分からないと言う意味でしょうか?
Re: 敵のショットの追加
Posted: 2015年11月09日(月) 22:08
by study15
内部の情報
- ショット画像
- 敵ショットのフラグ
- 弾幕データ
- 弾のフラグ
外部から貰う情報
- プレイヤーの座標 → 自機狙いの敵ショットを行う場合に必要(敵と自機との角度を返す)
- 敵のフラグ → 敵が倒されたとき、敵ショットをやめるため
- 敵の座標 → 敵の位置からショットを撃たせるため
- 敵情報にある弾幕の種類 → どの弾幕データを使うか
- 敵情報の配列の番号 → どの敵から発射されたか
敵ショットの登録は外部との情報のやりとりが必要であるかどうかです。
弾幕の種類とどの敵から発射されたものかを登録するために
外部との情報のやりとりが必要だと考えています。
Re: 敵のショットの追加
Posted: 2015年11月09日(月) 22:27
by softya(ソフト屋)
大分整理されましたが、時系列の問題があると思います。
プレイヤーの座標と敵の生存フラグは発射時の情報で固定してはまずくないですか?
ただ、敵の生存フラグは敵情報の配列の番号を弾が持っているなら、敵が死ぬとき同じ敵番号の弾の消滅を依頼する関数を作れば良い気がします。
> 敵ショットの登録は外部との情報のやりとりが必要であるかどうかです。
敵ショットの登録なら、敵ショット発生の関数として必要な引数は
敵の座標 → 敵の位置からショットを撃たせるため
弾幕の種類 → どの弾幕データを使うか
が最低限必要な敵から貰える情報です。
敵番号は、敵消滅と同時に弾が消えるゲーム仕様なら必要となるでしょう。それ以外では不要かと思います。
【補足】私の知る限り敵が消えても弾が消えないゲームが多い気がするんですが気のせいでしょうか。
敵→敵ショットのインターフェイスは必要ですが、逆はないでしょう。
プレイヤーの座標は敵が知るはず無いので、別途プレイヤーから貰うべきです。
Re: 敵のショットの追加
Posted: 2015年11月10日(火) 20:58
by study15
プレイヤーの座標は敵ショットの計算のとき、弾に渡しています。
敵情報の配列の番号を持たない場合はどのような処理をするのですか?
それと、敵モジュールに敵情報を取得する関数を作ったのですが
これを敵ショットモジュールで使用して悪影響はあるのしょうか?
Re: 敵のショットの追加
Posted: 2015年11月10日(火) 21:10
by softya(ソフト屋)
>プレイヤーの座標は敵ショットの計算のとき、弾に渡しています。
そうだとしても、敵モジュールが渡すのは変ですよ。
>敵情報の配列の番号を持たない場合はどのような処理をするのですか?
敵消滅と連動しないなら特に不要だと思います。
>それと、敵モジュールに敵情報を取得する関数を作ったのですが
>これを敵ショットモジュールで使用して悪影響はあるのしょうか?
・ポインタだと敵情報を破壊する可能性がある。 → デバッグの困難度上昇。
・敵情報の構造を変更した時の仕様変更の影響を敵ショットモジュールが受ける可能性がある。 → メンテナンス性の低下。デバッグの困難度上昇。
・敵情報への依存度が上昇。 → 敵ショットモジュールのボスへの使い回しが困難に。あるいは複雑化。
つまり、グローバル変数化をやめているはずなのにグローバル変数と同じ問題を引き起こす可能性が高くなるからです。
必要のない内部の情報にはアクセス出来なくするのがグローバル変数をやめる意図ですので、そこを取り違えるとグローバル化をやめる意味を失いかねません。
Re: 敵のショットの追加
Posted: 2015年11月10日(火) 21:32
by study15
プレイヤー座標はプレイヤーモジュール、
敵座標は敵モジュールから貰う、という感じでしょうか。
他のモジュールから情報を貰うやり方は他にありますか?
取得する関数にconstを付けてみましたが
Re: 敵のショットの追加
Posted: 2015年11月10日(火) 22:34
by softya(ソフト屋)
study15 さんが書きました:プレイヤー座標はプレイヤーモジュール、
敵座標は敵モジュールから貰う、という感じでしょうか。
他のモジュールから情報を貰うやり方は他にありますか?
取得する関数にconstを付けてみましたが
敵の構造体の構造を敵モジュール以外に公開している事自体が隠蔽の放棄を意味するので、何処までやりたいか次第でしょうか。