【问题标题】:Detect when a dynamic body stops overlapping a sensor on Corona SDK检测动态物体何时停止与 Corona SDK 上的传感器重叠
【发布时间】:2015-06-06 19:29:39
【问题描述】:

我正在制作一个主要基于动态物理体的游戏,现在我需要在该元素与作为传感器体的其他项目(箭头)重叠时对该元素施加力。

我知道我可以在箭头上发生具有相位的碰撞事件后立即开始施加力,但是,我如何检测何时停止施加力?

有没有办法知道动态对象何时超出传感器主体的范围?

【问题讨论】:

  • 鉴于您使用的是“开始”阶段,您不能只使用相应的“结束”阶段吗?
  • 我试过了,但即使动态体仍在传感器内部时也会调用它...当动态体在其中休眠时也会调用它(在调试阶段时测试过)。

标签: lua coronasdk physics collision overlap


【解决方案1】:

好的,经过多次尝试,甚至在考虑了分离轴定理之后,我以更简单的方式完成了这个(因为 SAT 对我来说太慢了):

element:addEventListener( "collision", function(event) 
    if (event.other.id=="ball") then
        if (event.phase=="began") then
            element.collision_counter=element.collision_counter+1
        elseif (event.phase=="ended") then
            element.collision_counter=element.collision_counter-1
        end
    end
end)

因此,据我了解,似乎每次验证 BodyShape 上的碰撞时都会调用 event.phase=="began",并且当对象不与该对象发生碰撞时调用 event.phase=="ended" Shape 了。现在,使这段代码运行良好的“秘密”是,如果对象仍在Body 上但与另一个Shape 发生冲突,那么首先为新的Shape 调用event.phase=="began",并且仅然后调用event.phase=="ended"

在此之后,由于我想影响对象在我的element 内的速度(这是我的情况下的箭头),我只是在我的场景中使用了Runtime:addEventListener( "enterFrame", scene ),下面的代码如下:

function scene:enterFrame()
    if (element.collision_counter>0) then
        local rad=math.rad(element.rotation)
        other_object:applyForce( 15, 0, other_object.x, other_object.y )
    end
end

【讨论】:

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