对于发布原因,这里是我正在尝试做的简单版本。
在屏幕上,我有一个简单的圆形物体,它是静止的,不会移动。然后用户可以拖放一条直线。如果线穿过那个圆圈,我希望触发碰撞事件。
似乎除非其中一个物体在移动,否则永远不会检测到碰撞。我可以在绘制线条时检测到碰撞吗?
碰撞事件
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 })
答案 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)
释放鼠标时执行光线投射。这样,您可以将两个对象保持静态,并通过光线投射回调知道它们相交。
(我知道这是一篇旧帖子,但这是我在谷歌搜索中的第一次点击并且不正确)