Corona/Box2D 检测与静态非移动对象的碰撞。

在屏幕上,我有一个简单的圆形对象,静态不动。然后用户可以拖放一条直线。如果直线穿过圆形,我希望发生碰撞事件。但似乎除非一个对象在移动,否则永远无法检测到碰撞。如何在绘制直线时检测碰撞?

碰撞事件

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

原文链接 https://stackoverflow.com/questions/7697555

点赞
stackoverflow用户5420
stackoverflow用户5420

这一页来自 Corona SDK 文档,大约在页面的一半描述了 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%,但有时会失败,例如从圆圈外部开始、从圆圈内部结束的线,这应该是重叠的,但有时会被报告为空重叠。我无法弄清楚为什么。我发帖是希望它能够帮助您,并希望有人能够找出不一致的行为并教育我们两个。

如果不行,您可以添加另一个检查来检查线的任一端点是否距中心的半径距离更近。这将使事情运作起来,但我认为它错过了让物理引擎工作的重点。

无论如何,祝您好运!

2011-10-08 22:02:03
stackoverflow用户3503986
stackoverflow用户3503986

当你松开鼠标时进行一次光线投射(raycast)。通过光线投射回调函数,你可以保持两个物体的静止,并且知道它们的交点。

(我知道这篇文章已经有点过时了,但它是我谷歌搜索的第一个结果,而且我认为它是错误的。)

2015-05-08 12:10:40
stackoverflow用户9157296
stackoverflow用户9157296

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

2021-12-20 21:32:32