在Corona SDK中,我有一个弯曲的LineObject,我需要其他对象才能碰撞。为了达到这个目的,我沿着这条曲线创造了大量(数百个)小型圆形物理实体(就像一串珍珠)。
线(“珍珠”)与其他对象之间的物理交互(碰撞)需要在运行时更改。由于无法在运行时修改碰撞过滤器,有没有办法在不重新显示所有圆圈的情况下执行此操作,这会影响性能?
答案 0 :(得分:1)
正如您所说,无法更改物理主体上的碰撞过滤器参数。为了澄清这意味着什么,请考虑使用Corona SDK documentation on Collisions中的过滤器的示例(这也很好地解释了categoryBits
和maskBits
的使用):
local floorCollisionFilter = { categoryBits=1, maskBits=6 }
local floor = display.newRect( 0, 0, 320, 80 )
physics.addBody( floor, "static", { filter=floorCollisionFilter } )
物理主体实例化后,对floorCollisionFilter
的更改不会影响floor
的碰撞属性。
但是,您可以使用 preCollision detection 更改对象的碰撞行为。如果对象上有preCollision侦听器,则可以确定它们是否应该参与正在触发的碰撞事件,如果不应该,则设置event.contact.isEnabled = false
。有些问题:如果您拥有许多物理实体并且预碰撞调用可能很嘈杂(每次碰撞事件可能有多次调用),这可能会很昂贵。
isBodyActive
属性也许您应该重新考虑如何在曲线上添加物理效果。你说你沿路径放置了许多圆圈(就像一串珠子/珍珠)来检测那条路径和其他物体之间的碰撞。如果路径的形状不需要更改,则应考虑使用edge shape (chain) body。创建它时使用的顶点数量或凸度要求似乎没有限制(与多边形体不同)。
这将允许您通过设置object
从模拟中移除边缘形状体(假设它被称为object.isBodyActive = false
)(其他实体将忽略/通过它)。这不会从显示中删除对象,您可以随时设置isBodyActive = true
。有关更改物理主体属性的信息,请参阅文档(即,您需要使用较小的延迟)。
关于使用边缘形状体的最后一点注意事项。即使路径的形状需要以受控方式进行更改,您也可能获得更好的性能,破坏现有的边缘体并沿着新路径创建一个新的边缘体,而不是移动大量的小圆体。