ページ 11

あるクラス内で立ったフラグを他クラスに反映させる方法

Posted: 2015年1月09日(金) 17:47
by しろうと!
あけましておめでとうございます。今年も引き続きパーツカスタマイズを行えるSTGを作成中なのですが、現在カスタマイズ画面での選択を別のクラスやシーンに反映させる方法(例えばカスタマイズ画面であるフラグが1になったことで自機の画像が変わる、ゲーム画面に「現在○○を装備しています」と表示されるなど)がわからなくて苦戦しております……。

ポインタ辺りを使えば良いのかなど考えてはおりますが、実際にはどのような処理を施せばフラグが立ったことで設定が反映されたようにする(見せる?)事が出来るのでしょうか?アドバイスの程宜しくお願いします

ちなみに自分はC++を学び始めて9~10ヶ月程で、ポインタや継承に関してはどういうものなのかは分かってはいるが、それをどうやって応用すればいいかが分からないというのが現状です。
開発環境はWindows7 VisualStudio2012となっています。

Re: あるクラス内で立ったフラグを他クラスに反映させる方法

Posted: 2015年1月09日(金) 18:18
by usao
ちょっと漠然としていますね.
「あるクラス内でフラグが立つ」とは…?
「フラグ」がどこに存在するのかわかりませんが,とりあえずそのフラグの状態を得るための手段を用意すればどうでしょうか?

コード:

//あるクラス
class A
{
public:
  A() {  m_Flag=false; }
public:
  void Work_of_A(){ m_Flag = true; }  //何か処理の結果としてフラグが立つ
  bool GetFlag() const {  return m_Flag;  }  //フラグの状態を返す
private:
  bool m_Flag;  //フラグ
};
「他のクラス」は,必要なときに,「あるクラス」が立てたかもしれないフラグの状態を情報としてもらえればいい.

コード:

//別のクラス
class B
{
...
public:
  //フラグの状態を引数に指定してもらう
  void Work_of_B( bool Flag )
  {
    Flagの値に応じて処理
  }
};

//
int main()
{
  A a;  //あるクラス のインスタンス
  B b;  //他のクラス のインスタンス
  ...
  a.Work_of_A();  //ここでフラグが立つ
  ...
  b.Work_of_B( a.GetFlag() );  //フラグの情報を渡す
  ...
}

Re: あるクラス内で立ったフラグを他クラスに反映させる方法

Posted: 2015年1月10日(土) 19:04
by ISLe()
モデル-ビュー アーキテクチャ的なことでしょうか。

ある情報(モデル)に対して、どの画像(ビュー)が影響を受けるかを整理しましょう。
そして、その関係を(汎用的に)管理するモジュールを用意しましょう。

変化があった場合は、そのモジュールに伝えます。
そのモジュールが影響を受けるモジュールに再描画を指示します。

そうすることで変化の要因を隠すことができて、特定のフラグに限らず応用できます。

Re: あるクラス内で立ったフラグを他クラスに反映させる方法

Posted: 2015年1月11日(日) 00:17
by しろうと!
>>suaoさん
>フラグがどこに存在するかわからない
確かに少し漠然としすぎましたね……
例えばカスタマイズを行うクラスで

コード:

if(mWeapon_flag==1){
///メイン武器フラグが1のときの動作///
		
			if(Keyboard_Get(KEY_INPUT_DOWN)==1){
				NowSelectMP =(NowSelectMP + 1)%eMainP_Num;
		}
		if(Keyboard_Get(KEY_INPUT_UP)==1){//上キーが押されていたら
				NowSelectMP = (NowSelectMP + (eMainP_Num-1))%eMainP_Num;//選択状態を一つ上げる
		}
		if(Keyboard_Get(KEY_INPUT_RETURN)==1){//エンターキーが押されたら
        switch(NowSelectMP){//現在選択中の状態によって処理を分岐
		case eMainP_Rapid://速射武器選択中なら
			if(RapidM_flag==0){
				RapidM_flag = 1;
				PowerM_flag=0;
				JunkM_flag=0;
				break;
			}
といった処理が入っていて、この「Rapid_flagが1になった」というのを他のクラスに伝える方法が知りたいという感じですね。

>>ISLe()さん
それはゲームプログラミングの館のメニュー画面の作り方(C++編)で取り上げられてたのと同じような感じでしょうか?

Re: あるクラス内で立ったフラグを他クラスに反映させる方法

Posted: 2015年1月11日(日) 05:06
by zxc

コード:

class RapidFlag{
 private:
  bool flag;
 public:
  bool IsTrue(){return flag;}
  bool IsFalse(){return !(flag);}
};

コード:

 RapidFlag rf;
 if(true == rf.IsTrue() ){・・・}
例えばですけどこういうのではダメなのでしょうか

Re: あるクラス内で立ったフラグを他クラスに反映させる方法

Posted: 2015年1月11日(日) 07:42
by nullptr

コード:

#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>


int main(){
    std::vector<std::function<void()>> callbacks;
    callbacks.push_back([]{
        std::cout << "UHOHOHOHO" << std::endl;
    });
    callbacks.push_back([]{
        std::cout << "YPAAAAAAAAAAAAAAAAA" << std::endl;
    });
    
    
    // なんかフラグたったぞい!!!!(フラグが1になったイベントなど)
    std::for_each( callbacks.begin(), callbacks.end(), []( std::function<void()> f ){
        f(); // 登録したコールバックが実行されるぞい!!!
    });
}
安直にこういうのとか。

GoFのObserverパターンとか調べても幸せになれるかもしれません。

Re: あるクラス内で立ったフラグを他クラスに反映させる方法

Posted: 2015年2月09日(月) 18:23
by しろうと!
返信が遅れて申し訳ありませんでした!
色々なアドバイスありがとうございます。
未だ肝心のプログラムの修正には漕ぎ付いていませんが、長くこのトピックを放置してしまったので解決にさせていただきます。