Corona / Box2D检测与不动静态物体的碰撞

时间:2011-10-08 14:47:42

标签: lua collision-detection box2d corona

对于发布原因,这里是我正在尝试做的简单版本。

在屏幕上,我有一个简单的圆形物体,它是静止的,不会移动。然后用户可以拖放一条直线。如果线穿过那个圆圈,我希望触发碰撞事件。

似乎除非其中一个物体在移动,否则永远不会检测到碰撞。我可以在绘制线条时检测到碰撞吗?

碰撞事件

function onHit(e)
    print("hit");
end
Runtime:addEventListener("collision", onHit)

触摸事件

local startX = 0;
local startY = 0;
local endX = 0;
local endY = 0;

function onTouch(e)
    if(e.phase == "began") then
        startX = e.x
        startY = e.y
    elseif(e.phase == "moved") then
        endX = e.x
        endY = e.y
    elseif(e.phase == "ended") then
        local line = display.newLine(startX, startY, endX, endY)
        line:setColor(100, 100, 100)
        line.width = 2
        physics.addBody(line, "static", {   })
    end
end
Runtime:addEventListener("touch", onTouch)

创建圈子

local c = display.newCircle(50, 50, 24)
physics.addBody(c, "static", { radius = 24 })

2 个答案:

答案 0 :(得分:1)

Corona SDK docs中的此页面描述了页面中间的bodyType属性。在描述“静态”身体时,它说(我的强调):

  

静态物体不移动,不相互作用;   静态物体的例子包括地面或墙壁   弹球机。

这意味着其中一个对象必须是static以外的其他对象。

这是一个想法,虽然我自己没有尝试过:(请参阅下面的更新。)在第一次创建时创建行dynamic。几毫秒后使用static函数将其设置为timer.performWithDelay。如果在此期间发生碰撞事件,您将知道您有重叠,并且可以立即将bodyType设置回static。如果您没有收到碰撞事件,bodyType在延迟例程中仍然是dynamic,您将知道您没有重叠。在这种情况下,您仍然需要在延迟例程中将行设置为static


更新:使用您的代码作为起点对此进行测试

我将碰撞事件更改为始终将两个对象“bodyType设置为静态:

function onHit(e)
    print("hit")
    e.object1.bodyType = "static"
    e.object2.bodyType = "static"
end

然后我更改了该行的addBody调用,将其添加为dynamic正文,并使用新代码设置timer.PerformWithDelay函数,以便在短时间后进行检查:

physics.addBody(line, "dynamic", {   })

timer.performWithDelay(10, 
    function()
        if line.bodyType == "dynamic" then
            print ("NO OVERLAP")
            line.bodyType = "static"
        end
    end)

不幸的是,结果好坏参半。它在大多数情况下工作,可能是95%,但偶尔会在绘制一条从圆圈外部开始并在内部结束的线时失败,这应该是重叠,但有时会报告为没有重叠。我无法弄清楚为什么会这样。无论如何我都会发布这个帖子,希望它可以让你前进,并且还认为有人可能能够找出不一致的行为并教育我们两者。

如果失败,您可以为“无重叠”情况添加额外检查,以检查线的任一端点是否比远离中心的圆的半径更近。这将使事情有效,但我想它错过了让物理引擎工作的全部观点。

无论如何,祝你好运!

答案 1 :(得分:0)

释放鼠标时执行光线投射。这样,您可以将两个对象保持静态,并通过光线投射回调知道它们相交。

(我知道这是一篇旧帖子,但这是我在谷歌搜索中的第一次点击并且不正确)