if ((catA & maskB) != 0 && (catB & maskA) != 0)
それはBox2d's manual: 6.2であり、2つのオブジェクトが衝突するかどうか(フィルタリング後)を確認するために使用されこのC++ステートメントは何をチェックしますか? (BOX2D)
if ((catA & maskB) != 0 && (catB & maskA) != 0)
それはBox2d's manual: 6.2であり、2つのオブジェクトが衝突するかどうか(フィルタリング後)を確認するために使用されこのC++ステートメントは何をチェックしますか? (BOX2D)
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つのオブジェクトが衝突することができます。
シンボル&
は、ビット単位のAND演算子です。したがって、文
(catA & maskB) != 0
は、これらの項目のビットが重複していないかどうかをチェックします。それはCATAがMASKBを有する少なくとも一つの共通の「1」ビットを有していることを確認A.
に対する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"
私は多くのC/C++プログラマは簡潔さを愛するが、私はこの種のコードは、(あなたがしたい場合は、あなたがそれをインライン化することができます)関数にこのテストを動かすことにより、はるかに読みやすくすることができます見つけることを知っています。また、コードを適切な名前のメソッドに移動することでコメントを取り除くこともできました。
if (FixturesCanCollide())
{
}
あなたは、明確にするため、それはおそらく同じコードにまでコンパイルのいずれかの方法でそれを好むかもしれませんが、あなたが実際に(!= 0との比較を捨てることができます。
inline bool FixturesCanCollide()
{
return (catA & maskB) && (catB & maskA);
}
?あなたは答えのように思えます自分自身に疑問:)私はコードは、彼らが必要場合に決定する何を知りたい – iforce2d
。 – andrew