重叠的凹形SKShapeNodes

时间:2015-12-16 01:07:33

标签: swift sprite-kit uibezierpath cgpath skshapenode

在我的应用程序中,我有两个凹SKShapeNodes,nodeA和nodeB,nodeA在屏幕上是静止的,而nodeB可以被用户的手指在屏幕上拖动。 nodeA需要能够检测nodeB是否与它重叠。首先,我尝试使用SKPhysicsContactDelegate碰撞检测。 didBeginContactdidEndContact方法被多次调用,通过研究我发现这是预期的行为。为了解决这个问题,我只需将一个整数变量设置为0,并在每次有联系时递增它,并在每次联系结束时递减它。如果该值大于0,则两个节点重叠,如果该值等于0,则它们不重叠。这种方法很好,直到用户在nodeA上拖动nodeB太快。发生这种情况时,联系方式并不总是称为正确的次数。例如,可能检测到3个联系人但只有两个结束联系人(甚至没有联系人),这使得程序认为两个节点仍然重叠,即使它们不是。我假设发生这种情况是因为用户拖动节点的速度比程序可以更新的速度快。然后我尝试在我的场景更新方法中使用intersectsNode方法,由于形状是凹的,这不起作用。基本上我只需要知道两个节点何时重叠以及何时不重叠。我怎样才能做到这一点?什么是最好的方法?

如果有帮助,下面是我用来构建每个SKShapeNode的代码:

path = UIBezierPath()
path.moveToPoint(CGPointMake(-27, -27))
path.addLineToPoint(CGPointMake(-17, -27))
path.addLineToPoint(CGPointMake(-17, 17))
path.addLineToPoint(CGPointMake(27, 17))
path.addLineToPoint(CGPointMake(27, 27))
path.addLineToPoint(CGPointMake(-27, 27))
path.addLineToPoint(CGPointMake(-27, -27))
path.closePath()

shapePath = path.CGPath    

shape = SKShapeNode(path: shapePath)
shape = SKPhysicsBody(polygonFromPath: shapePath)

1 个答案:

答案 0 :(得分:0)

你可以使用“强力”解决方案, 对于ShapeB中的每个顶点,检查它是否在ShapeA

NodeA内部的检查可以通过重播来实现 What is Raycasting

Pseudo code