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

Change collision properties of multiple existing physics bodies in Corona SDK

在 Corona SDK 中,我有一个弯曲的 LineObject,我需要其他对象才能与之发生碰撞。为此,我正在沿着这条曲线(就像一串珍珠)创建大量(数百个)小型圆形物理体。

线("pearls")和其他对象之间的物理交互(碰撞)需要在运行时改变。由于无法在运行时修改碰撞过滤器,有没有办法做到这一点而不从头开始重新显示所有圆圈,这会影响性能?

碰撞过滤器没有变化

如您所说,您不能在创建物理体后更改其碰撞过滤器参数。为了阐明这意味着什么,请考虑使用 Corona SDK documentation on Collisions 中的过滤器的示例(这也很好地解释了 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 属性

也许您应该重新考虑如何将物理添加到曲线中。你说你在一条路径上放置了许多圆圈(比如一串 beads/pearls)来检测该路径与其他物体之间的碰撞。如果路径的形状不需要改变,你应该考虑使用edge shape (chain) body。在创建它时使用的顶点数量或凸度要求似乎没有限制(与多边形体不同)。

这将允许您通过设置 object.isBodyActive = false 从模拟中移除边缘形状实体(假设它被称为 object)(其他实体将 ignore/pass 通过它)。这不会从显示中删除对象,您以后可以随时设置 isBodyActive = true。请参阅有关更改物理体属性的陷阱的文档(即您需要使用小的延迟)。

关于边缘形状体的使用的最后一个注意事项。即使路径 did 的形状需要以受控的方式改变,你可能会获得更好的性能,即破坏现有的边体并沿着新路径创建一个新的边体,而不是绕着新的路径移动大量的小圆体。