2015年4月13日 星期一

[Corona SDK] 如何利用physics.addBody() 參數裡outline來達成不規則物件的碰撞

底下是一個簡單的物理碰撞範例:
local physics = require( "physics" )
physics.start()

local sky = display.newImage( "bkg_clouds.png", 160, 195 )

local ground = display.newImage( "ground.png", 160, 445 )

physics.addBody( ground, "static", { friction=0.5, bounce=0.3 } )

local crate = display.newImage( "crate.png", 180, -50 )
crate.rotation = 5

physics.addBody( crate, { density=3.0, friction=0.5, bounce=0.3 } )
其中,用到的圖形如下:
bkg_clouds.png

crate.png

ground.png
碰撞之後結果如下:
不過,現實世界裡,很多物件不是如此方方正正,
假設我們把crate.pnggound.png修改如下:
crate.png

ground.png
再跑一次看看,執行結果如下:
碰撞的過程和結果都我們修改後的圖形無關,
執行仍是按照原來矩形形狀的碰撞結果???

其實在physics.addBody()參數裡,我們可以指定物體的形狀,
參數可以是矩形,圓形或多角形等等,
在這裡,我們可以直接用原來圖形的形狀來當參數,
也就是借用graphics.newOutline()取得的外觀,
修改程式如下:
local physics = require( "physics" )
physics.start()

local sky = display.newImage( "bkg_clouds.png", 160, 195 )

local ground = display.newImage( "ground.png", 160, 445 )
local ground_outline = graphics.newOutline( 2, "ground.png" )
physics.addBody( ground, "static", { friction=0.5, bounce=0.3,outline=ground_outline } )


local crate = display.newImage( "crate.png", 180, -50 )
crate.rotation = 5
local image_outline = graphics.newOutline( 2, "crate.png" )
physics.addBody( crate, { density=0.2, friction=0.5, bounce=0.3,outline=image_outline} )
graphics.newOutline()裡第一個參數是用來設定外觀的精細度,
再看一次執行結果:

沒有留言:

張貼留言