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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しろうと!
記事: 7
登録日時: 5年前

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

#1

投稿記事 by しろうと! » 5年前

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

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

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

アバター
usao
記事: 1574
登録日時: 7年前

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

#2

投稿記事 by usao » 5年前

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

コード:

//あるクラス
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() );  //フラグの情報を渡す
  ...
}

ISLe()

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

#3

投稿記事 by ISLe() » 5年前

モデル-ビュー アーキテクチャ的なことでしょうか。

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

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

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

しろうと!
記事: 7
登録日時: 5年前

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

#4

投稿記事 by しろうと! » 5年前

>>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++編)で取り上げられてたのと同じような感じでしょうか?

zxc
記事: 79
登録日時: 7年前
住所: 日本の背骨(?)あたり

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

#5

投稿記事 by zxc » 5年前

コード:

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

コード:

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

アバター
nullptr
記事: 239
登録日時: 8年前

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

#6

投稿記事 by nullptr » 5年前

コード:

#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パターンとか調べても幸せになれるかもしれません。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

しろうと!
記事: 7
登録日時: 5年前

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

#7

投稿記事 by しろうと! » 5年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る