我們可以在onGlobalCollision()去決定要如何處理碰撞,
假設我們希望fruit1和fruit2不會互相碰撞,要怎麼處理呢?
此時我們就必須增加filter的參數,如以下範例:
local main = display.newImage( "main.png", 160, 240 ) local mainCollisionFilter = { categoryBits=2, maskBits=1023 } physics.addBody( main, { density = 1.0, friction = 0.3, bounce = 0.2 , filter=mainCollisionFilter} ) main.myName = "main" local fruit1 = display.newImage( "fruit.png", 100, 120 ) local fruit1CollisionFilter = { categoryBits=4, maskBits=2 } physics.addBody( fruit1, { density = 1.0, friction = 0.3, bounce = 0.2, filter=fruit1CollisionFilter} ) fruit1.myName = "fruit1" local fruit2 = display.newImage( "fruit.png", 300, 220 ) local fruit2CollisionFilter = { categoryBits=8, maskBits=6 } physics.addBody( fruit2, { density = 1.0, friction = 0.3, bounce = 0.2, filter=fruit2CollisionFilter } ) fruit2.myName = "fruit2" local fruit3 = display.newImage( "fruit.png", 300, 220 ) physics.addBody( fruit3, { density = 1.0, friction = 0.3, bounce = 0.2 } ) fruit3.myName = "fruit3"其中,categoryBits是用來設定物體的類別,原則上每個物體都會不同,這樣才能區分,
因為要配合後面的maskBits,所以categoryBits設定也是以bit為操作,
當然,不同物體也可以設定成同一個categoryBits值,如果你希望它們的行為是類似的話,
categoryBits也可以是多個bits為1,例如7,
最後的行為都是看和maskBits執行mask的結果,
將上面範例整理成圖表方式:
fruit3並沒有設定filter,它的預設值就會變成{ categoryBits=1, maskBits=1023 },
也就是說,它會和任何物體碰撞,
如果有些物體有設定filter,有些物體沒有設定,
那麼,那些有設定filter的categoryBits,最好是從2開始,才能區分,
另外,範例中,雖然fruit2的maskBits是6,也就是說,它希望能和main以及fruit1碰撞,
但是因為fruit1的maskBits為2,fruit1不希望和fruit2碰撞,
mask執行是所有設定值執行AND的結果,所以fruit1和fruit2並不會發生碰撞
沒有留言:
張貼留言