ゲームではたくさんのフラグが必要になります
格闘ゲームならばコマンド入力でどのキーが押されたか?などのフラグ処理が必要になりますし
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;
	}

実行結果は次のようになります
flag.jpg

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

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


添付ファイル: fileflag.jpg 653件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-10 (金) 01:05:24