オブジェクト指向初心者です。現在C++でSTGを作っており質問があるのですが、自機が発射した弾オブジェクトが目標となる敵オブジェクトの座標をリアルタイムで取得したいなどの場合にはどうしたらよいのでしょうか。
敵や弾を管理するクラスを作ってそこから座標を渡してあげるという方法も考えましたが、これでは誘導する弾にはいちいち管理クラスが目標の座標を調べてやらないといけなくなり、オブジェクト指向的にも気持ち悪いような気がします。あるいはすべての弾オブジェクトに敵オブジェクトへの参照を最初に渡してしまったりしても良いのでしょうか?
オブジェクト間のアクセス方法
Re: オブジェクト間のアクセス方法
一応二つ目の場合の自分で考えたソースを載せておきます。
const int MAX_ENEMY = 100;
const int MAX_BULLET = 100;
class Enemy {
public:
Enemy(){}
};
class Bullet {
Enemy** enemy;
public:
Bullet(Enemy** enemy){
this->enemy = enemy;
}
};
int main() {
Enemy** enemy;
Bullet** bullet;
enemy = new Enemy*[MAX_ENEMY];
for(int i = 0; i < MAX_ENEMY; i++) {
enemy[i] = new Enemy();
}
bullet = new Bullet*[MAX_BULLET];
for(int i = 0; i < MAX_BULLET; i++) {
bullet[i] = new Bullet(enemy);
}
//enemyとbulletの解放
//・・・・・・・・・・・・・・・・
return 0;
}
Re: オブジェクト間のアクセス方法
敵や弾を管理するクラスを作るとそのクラスの構造がものすごく複雑になってしまわないかと不安なのですが・・・。
一つ一つの敵に固有の番号を持たせて、もしそのIDが変わっていたり、敵の状態がすでにやられていることを示す場合には目標が消滅したとするのはどうでしょうか。usao さんが書きました: 指定されたターゲットの生存期間に関わる問題をどこで解決するのか?とかいう別の問題に頭を悩ませそう
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: オブジェクト間のアクセス方法
逆に、そのクラスだけが複雑になり、敵や弾のクラスはお互いの情報を持たないので構造がシンプルになりメンテナンス性が向上すると考えることも出来ます。sato さんが書きました:敵や弾を管理するクラスを作るとそのクラスの構造がものすごく複雑になってしまわないかと不安なのですが・・・。
それで生存確認できる保証がないと思うのですが、なにか説明不足なのではないかと。sato さんが書きました:一つ一つの敵に固有の番号を持たせて、もしそのIDが変わっていたり、敵の状態がすでにやられていることを示す場合には目標が消滅したとするのはどうでしょうか。usao さんが書きました: 指定されたターゲットの生存期間に関わる問題をどこで解決するのか?とかいう別の問題に頭を悩ませそう
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: オブジェクト間のアクセス方法
なるほど。確かにそのほうが簡単にまとめられますね。softya(ソフト屋) さんが書きました:
逆に、そのクラスだけが複雑になり、敵や弾のクラスはお互いの情報を持たないので構造がシンプルになりメンテナンス性が向上すると考えることも出来ます。
すみません。生存確認とはオブジェクトの実体がまだ存在しているかどうかということなのでしょうか。ご教授ください。softya(ソフト屋) さんが書きました: それで生存確認できる保証がないと思うのですが、なにか説明不足なのではないかと。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: オブジェクト間のアクセス方法
生存確認というのは、
> 一つ一つの敵に固有の番号を持たせて、もしそのIDが変わっていたり、敵の状態がすでにやられていることを示す場合には目標が消滅したとするのはどうでしょうか。
敵の状態が生存なのか消滅なのか固有番号から、どうやって判定するかちゃんと説明されていないと言うことです。
言葉足らずなのかと思いました。
なお、オブジェクトの生成・消滅のタイミングも説明されていません。
> 一つ一つの敵に固有の番号を持たせて、もしそのIDが変わっていたり、敵の状態がすでにやられていることを示す場合には目標が消滅したとするのはどうでしょうか。
敵の状態が生存なのか消滅なのか固有番号から、どうやって判定するかちゃんと説明されていないと言うことです。
言葉足らずなのかと思いました。
なお、オブジェクトの生成・消滅のタイミングも説明されていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: オブジェクト間のアクセス方法
固有番号は新しく敵が出現するごとに番号をインクリメントし、同じIDを持った敵はできないようにします。また、それとは別に敵クラスにではその敵がまだ画面上で生存しているのか、あるいはやられたのかなどの状態を格納する別のメンバ変数を用意しておき、固有のIDが変わっている、あるいは状態変数が既にやられたことを示している場合には目標はすでに消滅していると判断するということです。
固有IDを用意するのは目標とする敵が既にやられていても同じ変数に新しい敵が生成されてしまう可能性があるのではと思ったからです。
オブジェクトの生成・解放はプログラムが開始・終了した時点でゲーム全体の処理(メインループなど)をまとめているクラスで行っています。
固有IDを用意するのは目標とする敵が既にやられていても同じ変数に新しい敵が生成されてしまう可能性があるのではと思ったからです。
オブジェクトの生成・解放はプログラムが開始・終了した時点でゲーム全体の処理(メインループなど)をまとめているクラスで行っています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: オブジェクト間のアクセス方法
その仕組みで目的のオブジェクトには固有IDでアクセスするって事なら管理クラスは問題無いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: オブジェクト間のアクセス方法
安心しました。softya(ソフト屋) さんが書きました:その仕組みで目的のオブジェクトには固有IDでアクセスするって事なら管理クラスは問題無いと思います。
これでこのトピックは解決とさせていただきます。
softyaさん、usaoさん、お二方ともありがとうございました。