2011-10-08 118 views
3

因为发布的原因,这里是我想要做的简单版本。电晕/ 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 }) 

回答

1

本页面从Corona SDK docs介绍有关网页下半部的bodyType财产。当描述“静”的机构,它说(我的重点):

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

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

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


UPDATE:测试此,使用你的代码为出发点

我改变了碰撞事件总是设置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%,但偶尔会在绘制一条从圆圈外部开始并结束于内部的线条时偶尔失败,这应该是重叠,但有时会报告为不重叠。我无法弄清楚为什么会发生这种情况。无论如何,我都会发布这个消息,希望它能让你继续前进,同时也想到有人可能会发现不一致的行为并教育我们两人。

如果不成功,您可以为“无重叠”情况添加额外的检查,以检查该线的任一端点是否比离开中心的圆的半径更近。这将会使事情发挥作用,但我认为它错过了让物理引擎工作的整个观点。

无论如何,祝你好运!

+0

有趣的工作周围。虽然不是最好的解决方案,正如你已经说过的,但它是唯一提供的解决方案。谢谢。 – Paramount

0

当您释放鼠标按下时执行光线播放。通过这种方式,您可以使两个对象保持静态,并知道它们通过raycast回调相交。

(我知道这是旧的文章,但它是在我的谷歌搜索先打和是不正确afaic)