1. 程式人生 > >cocos2dx 3.x 物理引擎接觸檢測掩碼、碰撞掩碼和類別掩碼問題解析

cocos2dx 3.x 物理引擎接觸檢測掩碼、碰撞掩碼和類別掩碼問題解析

言簡意賅,物體的類別掩碼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

這樣“與”運算為了,兩者不會發生碰撞。

-最後要注意的是,碰撞時只要有一方的類別掩碼和碰撞掩碼與運算為零雙方不會碰撞,但是要是觸發接觸時間需要雙方彼此的類別掩碼和接觸測試掩碼與運算非零才可以。