ページ 11

オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 18:04
by sato
オブジェクト指向初心者です。現在C++でSTGを作っており質問があるのですが、自機が発射した弾オブジェクトが目標となる敵オブジェクトの座標をリアルタイムで取得したいなどの場合にはどうしたらよいのでしょうか。
敵や弾を管理するクラスを作ってそこから座標を渡してあげるという方法も考えましたが、これでは誘導する弾にはいちいち管理クラスが目標の座標を調べてやらないといけなくなり、オブジェクト指向的にも気持ち悪いような気がします。あるいはすべての弾オブジェクトに敵オブジェクトへの参照を最初に渡してしまったりしても良いのでしょうか?

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 18:25
by sato
一応二つ目の場合の自分で考えたソースを載せておきます。

コード:

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: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 18:49
by usao
別に「こうしなければダメ」という決まりがあるわけではないので
好きな方法でやれば良いと思うのですが,
コードで示されたような方法でいくとしたら,私なら少なくともこう↓するかなぁ

コード:

class Bullet {
    Enemy* enemy;  //ターゲットだけを知っていれば良いのでは?
で,それはそれとして,こういう方法をとる場合だと,
指定されたターゲットの生存期間に関わる問題をどこで解決するのか?とかいう別の問題に頭を悩ませそうだから
個人的には,敵の消滅を知り得る層に管理してもらった方が見通しが良いような気もします.

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 19:43
by sato
敵や弾を管理するクラスを作るとそのクラスの構造がものすごく複雑になってしまわないかと不安なのですが・・・。
usao さんが書きました: 指定されたターゲットの生存期間に関わる問題をどこで解決するのか?とかいう別の問題に頭を悩ませそう
一つ一つの敵に固有の番号を持たせて、もしそのIDが変わっていたり、敵の状態がすでにやられていることを示す場合には目標が消滅したとするのはどうでしょうか。

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 20:10
by softya(ソフト屋)
sato さんが書きました:敵や弾を管理するクラスを作るとそのクラスの構造がものすごく複雑になってしまわないかと不安なのですが・・・。
逆に、そのクラスだけが複雑になり、敵や弾のクラスはお互いの情報を持たないので構造がシンプルになりメンテナンス性が向上すると考えることも出来ます。
sato さんが書きました:
usao さんが書きました: 指定されたターゲットの生存期間に関わる問題をどこで解決するのか?とかいう別の問題に頭を悩ませそう
一つ一つの敵に固有の番号を持たせて、もしそのIDが変わっていたり、敵の状態がすでにやられていることを示す場合には目標が消滅したとするのはどうでしょうか。
それで生存確認できる保証がないと思うのですが、なにか説明不足なのではないかと。

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 20:40
by sato
softya(ソフト屋) さんが書きました:
逆に、そのクラスだけが複雑になり、敵や弾のクラスはお互いの情報を持たないので構造がシンプルになりメンテナンス性が向上すると考えることも出来ます。
なるほど。確かにそのほうが簡単にまとめられますね。
softya(ソフト屋) さんが書きました: それで生存確認できる保証がないと思うのですが、なにか説明不足なのではないかと。
すみません。生存確認とはオブジェクトの実体がまだ存在しているかどうかということなのでしょうか。ご教授ください。

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 20:51
by softya(ソフト屋)
生存確認というのは、
> 一つ一つの敵に固有の番号を持たせて、もしそのIDが変わっていたり、敵の状態がすでにやられていることを示す場合には目標が消滅したとするのはどうでしょうか。
敵の状態が生存なのか消滅なのか固有番号から、どうやって判定するかちゃんと説明されていないと言うことです。
言葉足らずなのかと思いました。

なお、オブジェクトの生成・消滅のタイミングも説明されていません。

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 21:25
by sato
固有番号は新しく敵が出現するごとに番号をインクリメントし、同じIDを持った敵はできないようにします。また、それとは別に敵クラスにではその敵がまだ画面上で生存しているのか、あるいはやられたのかなどの状態を格納する別のメンバ変数を用意しておき、固有のIDが変わっている、あるいは状態変数が既にやられたことを示している場合には目標はすでに消滅していると判断するということです。
固有IDを用意するのは目標とする敵が既にやられていても同じ変数に新しい敵が生成されてしまう可能性があるのではと思ったからです。

オブジェクトの生成・解放はプログラムが開始・終了した時点でゲーム全体の処理(メインループなど)をまとめているクラスで行っています。

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 21:30
by softya(ソフト屋)
その仕組みで目的のオブジェクトには固有IDでアクセスするって事なら管理クラスは問題無いと思います。

Re: オブジェクト間のアクセス方法

Posted: 2013年9月16日(月) 21:34
by sato
softya(ソフト屋) さんが書きました:その仕組みで目的のオブジェクトには固有IDでアクセスするって事なら管理クラスは問題無いと思います。
安心しました。

これでこのトピックは解決とさせていただきます。
softyaさん、usaoさん、お二方ともありがとうございました。