Corona SDK - 两个对象之间的物理碰撞在设备上不起作用。

我正在尝试检测动态对象与静态对象的碰撞,在模拟器上运行正常,但在设备上没有。

在createScene函数中,我创建了这些对象:

b1 = display.newRect(50, 80, 140, 140)
b1:setFillColor(49/255, 179/255, 173/255)
b1.anchorX = 0.0
b1.anchorY = 0.0
physics.addBody(b1, "static", { density = 1.0, friction = 0.3, bounce = 0.2 })

b1:addEventListener("collision", onCollision)

playerBox = display.newRect(display.contentCenterX - 55, display.contentCenterY - 55, 110, 110)
playerBox:setFillColor(241/255, 76/255, 0/255)
playerBox.anchorX = 0.0
playerBox.anchorY = 0.0
playerBox:addEventListener("touch", onTouch)
physics.addBody(playerBox, "dynamic", { friction=0.3, isSensor=true })

playerBox:addEventListener("collision", onCollision)

group:insert(b1)

group:insert(playerBox)

在监听器中:

local function onCollision(event)
    if (event.phase == "began") then
        gameOver()
    elseif (event.phase == "ended") then
    end
end

在设备上永远不会调用gameOver()函数。

请问有什么帮助吗?

点赞
用户1381216
用户1381216

你需要先加载物理库,然后在添加物理实体前调用 physics.start()。同时,你的物理实体必须对齐以实现碰撞。修复好的代码如下:

local physics = require("physics")
physics.start()

local group = display.newGroup()

local function onTouch()
    print("touched")
end

local function gameOver()
    print("gameover")
end

local function onCollision( event )
    if ( event.phase == "began" ) then
      gameOver()
    elseif ( event.phase == "ended" ) then
    end
end

b1 = display.newRect(  display.contentCenterX - 50,display.contentCenterY, 140, 140 )
b1:setFillColor( 49/255, 179/255, 173/255 )
b1.anchorX = 0.0
b1.anchorY = 0.0
physics.addBody( b1, "static", { density = 1.0, friction = 0.3, bounce = 0.2 }  )
b1:addEventListener( "collision", onCollision )

playerBox = display.newRect( display.contentCenterX - 55, display.contentCenterY - 150, 110, 110 )
playerBox:setFillColor( 241/255, 76/255, 0/255 )
playerBox.anchorX = 0.0
playerBox.anchorY = 0.0
playerBox:addEventListener( "touch", onTouch )
physics.addBody( playerBox, "dynamic", { friction=0.3, isSensor=true } )

playerBox:addEventListener( "collision", onCollision )

group:insert( b1 )

group:insert( playerBox )

此外,我添加了一些可能已经存在但是没加的函数,只是为了运行代码而已。记住 playerBox 是一个传感器,所以不会有碰撞反应,其他物体会穿过它。

2014-04-06 22:59:40