2012-04-06 16 views

答えて

0

CATAと同じのビットフィールドされることを意味しますオブジェクトの衝突カテゴリ MASKAはと衝突するオブジェクトのカテゴリのビットのフィールドです。例えば

catA = 100010000010010 // Object A is in 4 collision categories 
maskA = 001010000000000 // Object A can collide with too different categories 

catB = 000010001000001 // Object B is in 3 collision categories 
maskB = 100000000000000 // Object B can only collide with the category represented by the highest bit 

CATA & MASKBはCATAとMASKB両方に1、そう1000000000000000されたビットを意味します。オブジェクトBは最上位ビットのオブジェクトと衝突し、オブジェクトAはそのビットがセットされているため、0ではありません。

catB & maskAは、catBとmaskAの両方で1であるビットを意味します。したがって、0000100000000000です。オブジェクトAは5番目に高いビットカテゴリのオブジェクトと衝突し、オブジェクトBはそのカテゴリに入ることができるので、ゼロではない。

だから、2つのオブジェクトが衝突することができます。

0

シンボル&は、ビット単位のAND演算子です。したがって、文

(catA & maskB) != 0 

は、これらの項目のビットが重複していないかどうかをチェックします。それはCATAがMASKBを有する少なくとも一つの共通の「1」ビットを有していることを確認A.

2

に対するBでは、次に、それは最初Bに対してチェックした場合を見て、CATBはMASKAを有する少なくとも一つの共通の「1」ビットを有しています。次に、例えば

、CATA 3(00000011二進)でありMASKBが10101010である場合)、(CATA & MASKB)!= 0 CATA & MASKBこのマスキングと呼ばれ00000010.

、手段であるので、真であります興味のあるものだけを保持しています。

はあなたが頻繁にコンストラクトのこの種持って

:ところで

#define READ 1 
#define WRITE 2 
#define READWRITE (READ|WRITE) 
#define DIRECTORY 4 

int i=getFileInfo("myfile"); 
if(i & READWRITE)puts("you can read or write in myfile"); 
if(i & DIRECTORY)puts("myfile is a directory"); 

は、 "私は&ディレクトリには、" "!(I &ディレクトリ)= 0"

0

私は多くのC/C++プログラマは簡潔さを愛するが、私はこの種のコードは、(あなたがしたい場合は、あなたがそれをインライン化することができます)関数にこのテストを動かすことにより、はるかに読みやすくすることができます見つけることを知っています。また、コードを適切な名前のメソッドに移動することでコメントを取り除くこともできました。

if (FixturesCanCollide()) 
{ 
} 

あなたは、明確にするため、それはおそらく同じコードにまでコンパイルのいずれかの方法でそれを好むかもしれませんが、あなたが実際に(!= 0との比較を捨てることができます。

inline bool FixturesCanCollide() 
{ 
    return (catA & maskB) && (catB & maskA); 
} 
関連する問題