cocos2dx 3.x 物理引擎接觸檢測掩碼、碰撞掩碼和類別掩碼問題解析
阿新 • • 發佈:2019-02-02
言簡意賅,物體的類別掩碼CategoryBitMask和物體的接觸測試掩碼ContactTestBitmask邏輯“與”運算結果非零,則觸發EventListenerPhysicsContact事件監聽器,物體的類別掩碼CategoryBitMask和物體的 碰撞掩碼CollisionBitmask邏輯“與”運算結果非零,則觸發物體碰撞效果。
//類別掩碼,預設值0xFFFFFFFF
body->setCategoryBitMask(int bitmask);
//接觸檢測掩碼,預設值0x00000000
body->setContactTestBitmask(int bitmask);
//碰撞掩碼,預設值0xFFFFFFFF
body->setCollisionBitmask(int bitmask);
- 例,笑臉和白雲一接觸併發生碰撞(注意,接觸和碰撞時有區別的,下例說明),笑臉顏色變綠,白雲顏色也變綠。如下圖:
在這個例子中要觸發物理接觸時間EventListenerPhysicsContact,如果用預設值,則笑臉的類別掩碼是0xFFFFFFFF,白雲的接觸檢測掩碼是0x00000000,“與”運算後是0,同樣,白雲的類別掩碼是0xFFFFFFFF,笑臉的接觸檢測掩碼是0x00000000,“與”運算後也是0,不會觸發事件監聽器,所以要重新設定其中兩方的接觸測試掩碼,只設置一方也不會觸發事件監聽器。設定如下:
bodySmile->set ContactTestBitmask(0x00000001);
bodyCloud->setContactTestBitmask(0x00000001);
兩者的類別掩碼和碰撞掩碼預設值都是0xFFFFFFFF,“與”運算後非零,所以觸發了碰撞,直白地說就是笑臉沒有穿過白雲。
- 例,笑臉和白雲一接觸但不發生碰撞,笑臉顏色變綠,白雲顏色也變綠。如下圖:
笑臉和白雲的接觸檢測掩碼同上,我們要修改的是碰撞掩碼和類別掩碼。
//這樣改的話,物體body不會跟任何其他物體發生碰撞(但是有接觸),
//包括我們給視窗設定的邊界框,效果就是落出螢幕外
body->setCollisionBitmask(0x00000000);
我的做法如下:
//笑臉類別掩碼
bodySmile->setCategoryBitmask(0x02);//0010,只寫後4位
//白雲碰撞掩碼
bodyCloud->setCollisionBitmask(0x01);//0001
這樣“與”運算為了,兩者不會發生碰撞。