2015年4月29日 星期三

[Corona SDK] 如何決定各個物體間的碰撞發生與否?

[Corona SDK] 如何偵測物體碰撞 - 利用Global Collision裡,我們會發現所有的物體都會互相碰撞,
我們可以在onGlobalCollision()去決定要如何處理碰撞,
假設我們希望fruit1fruit2不會互相碰撞,要怎麼處理呢?
此時我們就必須增加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,有些物體沒有設定,
那麼,那些有設定filtercategoryBits,最好是從2開始,才能區分,

另外,範例中,雖然fruit2maskBits是6,也就是說,它希望能和main以及fruit1碰撞,
但是因為fruit1maskBits為2,fruit1不希望和fruit2碰撞,
mask執行是所有設定值執行AND的結果,所以fruit1fruit2並不會發生碰撞

沒有留言:

張貼留言