ゲームではたくさんのフラグが必要になります
格闘ゲームならばコマンド入力でどのキーが押されたか?などのフラグ処理が必要になりますし
RPGなどではイベントのフラグなど山ほどあるわけです

例えばbool型でフラグの数だけ定義すると・・・
 
 bool isUP;   // キー上が押された
 bool isDown; // キー下が押された
 bool isRight;// キー右が押された
 bool isLeft; // キー左が押された

のようにフラグ単位で変数を用意する羽目になります
これではフラグの管理が大変になってしまいます
また、フラグデータの保存(セーブなど)にはあまりに非効率です
そこでビット単位でフラグを定義し、一つの整数型の変数に複数のフラグを格納すれば、
フラグ変数の数も劇的に減らすことができます


以下にサンプルを示します

	#include <stdio.h>
 
	// フラグの作り方
	// 各ビットの桁がフラグとして扱える
	enum MOVEFLAG{
		UP    = (1 << 0), // シフト演算でずらして各桁のビットを立てる
		DOWN  = (1 << 1),
		LEFT  = (1 << 2),
		RIGHT = (1 << 3)
	};
  
	int main()
	{
		// int型はWindows環境下では32bitの変数として扱える
		// つまり、最大32個のフラグを格納できる
		// 0で初期化
		int flag = 0; 
		// フラグを立てたい場合はOR演算
		flag |= UP;
		// OR演算の組み合わせで同時に複数のフラグを立てることができる
		flag |= (RIGHT | LEFT);
 
		// フラグが立っているかどうか調べるにはAND演算を使う
		if(flag & UP){
			printf("UP\n");
		}
		// UPかつRIGHTの場合
		if( (flag & UP) && (flag & RIGHT)){
			printf("UP and RIGHT\n");
		}
 
		// フラグを降ろしたい場合はXORとANDを組み合わせる
		flag &= (flag ^ UP);
		if(flag & UP){
			printf("UP\n");
		}
		// 一括で降ろしたい場合
		flag &= (flag ^ (LEFT | RIGHT));
		if( (flag & LEFT) || (flag & RIGHT)){
			printf("LEFT or RIGHT\n");
		}
		return 0;
	}

実行結果は次のようになります
&ref(flag.jpg);

さらに興味がある人はstd::bitsetで調べてみると良いと思います
std::bitsetはSTLで定義されたビット管理用のコンテナです
C++が使える環境下ならば積極的に使っていくべきです

#vote(理解できた(^ω^)[12],なんぞこれーΣ(゚д゚lll)[0],ちょっと理解できないですね(´・ω・`)[0])
vote(理解できた(^ω^)[12],なんぞこれーΣ(゚д゚lll)[0],ちょっと理解できないですね(´・ω・`)[0])

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS