【问题标题】:Corona/Box2D detect collision with non-moving static objectsCorona/Box2D 检测与非移动静态物体的碰撞
【发布时间】:2011-12-03 14:18:58
【问题描述】:

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

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

似乎除非其中一个物体正在移动,否则永远不会检测到碰撞。画线时能检测到碰撞吗?

碰撞事件

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 })

【问题讨论】:

    标签: lua collision-detection box2d coronasdk


    【解决方案1】:

    这个来自Corona SDK docs 的页面描述了大约在页面中间的bodyType 属性。在描述“静态”物体时,它说(我的重点):

    静态物体不会移动,并且不会相互影响; 静态对象的示例包括地面或墙壁 弹球机。

    这意味着其中一个对象必须不是static

    这是一个想法,虽然我自己还没有尝试过:(请参阅下面的更新。)当你第一次创建它时,请制作dynamic。几毫秒后使用timer.performWithDelay 函数将其设置为static。如果在此期间发生碰撞事件,您将知道您有重叠,并且可以立即将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%,但在绘制一条从圆外开始并在圆内结束的线时偶尔会失败,这应该是重叠,但有时会报告为没有重叠。我无法弄清楚为什么会这样。无论如何我都会发布这个,希望它能让你继续前进,并认为有人可能能够找出不一致的行为并教育我们俩。

    如果做不到这一点,您可以为“无重叠”情况添加额外的检查,以检查线的任一端点是否比远离中心的圆的半径更近。那会让事情顺利进行,但我想它错过了让物理引擎工作的全部意义。

    无论如何,祝你好运!

    【讨论】:

    • 有趣的解决方法。正如您已经说过的那样,虽然不是最好的解决方案,但它是唯一提供的解决方案。谢谢。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      将身体类型设置为运动学,将其设置为传感器,并将其位置更新为它绑定到每一帧的实体。与静态不同,运动学可以与静态交互。

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多