正传传送门:SpriteKit:开启物理逐像素(Per-Pixel)碰撞检测后发现的问题及解决
之后还是发现一个小问题,就是虽然player可以正确处理碰撞scoreDetect出发点和其他障碍物,但是由于启用了Per-Pixel,还是会发生多次接触的情况,这时玩家的得分就会被多次累加!
相关代码如下:
if contact.bodyA.categoryBitMask == Mask.scoreDetect || contact.bodyB.categoryBitMask == Mask.scoreDetect{
if contact.bodyA.node == player{
contact.bodyB.node?.removeFromParent()
}else{
contact.bodyA.node?.removeFromParent()
}
let sound = SKAction.playSoundFileNamed("coin.wav", waitForCompletion: false)
run(sound)
score += 1
return
}
注意最外围的if判断在player与触发器多次接触时会多次enter,从而导致score += 1多次被调用,这显然不符合实际!
要解决很简单,将代码改写为如下:
if contact.bodyA.categoryBitMask == Mask.scoreDetect || contact.bodyB.categoryBitMask == Mask.scoreDetect{
if contact.bodyA.node?.name == rockCollisionName || contact.bodyB.node?.name == rockCollisionName{
if contact.bodyA.node == player{
contact.bodyB.node?.removeFromParent()
}else{
contact.bodyA.node?.removeFromParent()
}
let sound = SKAction.playSoundFileNamed("coin.wav", waitForCompletion: false)
run(sound)
score += 1
}
return
}
即增加一层判断即可,至于为什么,相信大家可以自行烧脑搞清楚 ;]