在 Corona SDK 中更改多个现有物理体的碰撞属性

在 Corona SDK 中,我有一个弯曲的 LineObject,我需要其他对象能够与之碰撞。为了实现这一点,我沿着这条弯曲的线(像珍珠串一样)创建了大量的小圆形物理体。

线(“珍珠”)与其他对象之间的物理相互作用(碰撞)需要在运行时更改。由于不可能在运行时修改碰撞过滤器,是否有一种方法可以在不从头开始重新显示所有圆圈的情况下完成此操作,从而影响性能?

点赞
用户3455883
用户3455883

碰撞过滤器不可更改

如你所说,一旦创建了物理体,就不能更改碰撞过滤器参数。为了阐明这意味着什么,考虑这个从 Corona SDK 碰撞文档 中使用过滤器的例子(也很好地解释了 categoryBitsmaskBits 的使用):

local floorCollisionFilter = { categoryBits=1, maskBits=6 }
local floor = display.newRect( 0, 0, 320, 80 )
physics.addBody( floor, "static", { filter=floorCollisionFilter } )

物理体被实例化之后,对 floorCollisionFilter 的更改不会影响 floor 的碰撞属性。

预碰撞检测

但是,您可以使用 预碰撞检测 更改对象的碰撞行为。如果您的对象上有一个预碰撞监听器,您可以确定它们是否应该参与正在触发的碰撞事件,并且设置 event.contact.isEnabled = false 如果不需要。需要注意的是:如果您有许多物理体,并且预碰撞调用可能很嘈杂(每个碰撞事件可能有许多可能的调用),则这可能是代价高昂的。

多元素体和 isBodyActive 属性

也许您应该重新考虑如何将物理效果添加到曲线上。您说您正在沿路径放置许多圆圈(如珠串),以检测该路径与其他物体之间的碰撞。如果路径的形状不需要更改,则应考虑使用 边缘形状(链式)体。在创建过程中使用的顶点数量或凸性要求似乎没有限制(不像多边形的体)。

这将允许您通过设置 object.isBodyActive = false 从模拟中删除边缘形状体(其他物体将忽略/穿过它)。这不会从显示中删除对象,您随时可以设置 isBodyActive=true。有关更改物理体属性的注意事项(即需要使用小延迟),请参阅文档。

关于边缘形状体的最后一个说明。即使路径的形状需要以受控方式更改,您在沿新路径移动大量小圆形物体之前,也可能会获得更好的性能,通过销毁存在的边缘体并创建新的沿新路径的体。

2017-04-06 20:53:43