【发布时间】:2015-07-15 04:11:08
【问题描述】:
我有一个球节点和一个洞节点。我想检测球何时会落入货舱。
目前我正在使用 didBeginContact,但它只给了我接触开始时两个节点的距离,在这种情况下,球不一定会落入洞中(当两个中心之间的距离
有没有办法在接触发生后跟踪球的位置?
【问题讨论】:
标签: swift sprite-kit
我有一个球节点和一个洞节点。我想检测球何时会落入货舱。
目前我正在使用 didBeginContact,但它只给了我接触开始时两个节点的距离,在这种情况下,球不一定会落入洞中(当两个中心之间的距离
有没有办法在接触发生后跟踪球的位置?
【问题讨论】:
标签: swift sprite-kit
您可以添加隐形SKSpriteNodes 并跟踪球何时接触它们。在进入球洞之前,node1 就在球洞的顶部(球必须穿过或接触球洞的区域)然后进入球洞,node2 就在球洞之后(同样,一个区域球进洞后必须穿过——或接触——)。
如果球触及node1 而不是node2,你知道它几乎要进入球洞,但它没有。如果球接触node2,您就知道球正试图从底部穿过孔。
【讨论】:
我想你可以让一个洞的物理体更小。这样,当发生接触时,您将确定球会落入洞中。看看这张图(第二个例子):
除此之外,作为一个额外的想法,当检测到接触时,您可以让球多移动一点,然后将其缩小以产生坠落的印象。
【讨论】:
没有必要测试球和球洞之间的接触,因为它不会告诉你目标是否完成。或者,您可以简单地在didSimulatePhysics 中添加一个检查,以查看球是否足够靠近球洞,然后再开始下落动画序列。例如,
override func didSimulatePhysics() {
let dx = ball.position.x - hole.position.x
let dy = ball.position.y - hole.position.y
let distance = sqrt(dx*dx+dy*dy)
if (distance < hole.size.width / 2.0) {
// Start falling animation sequence
}
}
或者,您可以测试球的移动速度是否足以跳过洞
override func didSimulatePhysics() {
let dx = ball.position.x - hole.position.x
let dy = ball.position.y - hole.position.y
let distance = sqrt(dx*dx+dy*dy)
if (distance < hole.size.width / 2.0) {
// Check if the ball is moving fast
let vx = ball.physicsBody!.velocity.dx
let vy = ball.physicsBody!.velocity.dy
let speed = sqrt(vx*vx+vy*vy)
if (speed < minSpeedToSkipOverHole) {
// Start falling animation sequence
}
}
}
【讨论】:
这个问题是这样解决的:我为每个球维护一个所有接触孔的 possible_falling_list 并使用另一个计时器来经常检查球是否落入任何孔中。由于每个球的列表都很小,因此性能不是问题。
【讨论】: