ゲームシステム講座1回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
ゲームではたくさんのフラグが必要になります
格闘ゲームならばコマンド入力でどのキーが押されたか?など...
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],ちょっ...
終了行:
ゲームではたくさんのフラグが必要になります
格闘ゲームならばコマンド入力でどのキーが押されたか?など...
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],ちょっ...
ページ名: