SpriteKit:开启物理逐像素(Per-Pixel)碰撞检测后发现的问题及解决(续)

正传传送门: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
        }

即增加一层判断即可,至于为什么,相信大家可以自行烧脑搞清楚 ;]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值