SpriteKit改变Node锚点其物理对象位置不正确的解决

Posted 大熊猫侯佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpriteKit改变Node锚点其物理对象位置不正确的解决相关的知识,希望对你有一定的参考价值。

在创建Node的物理对象后,默认情况下物理对象和Node的实际边界对应的很好,因为此时Node的默认锚点是其中心位置即(0.5,0.5),不过如果我们改变了Node的锚点,就会发现其物理边界还是保持原来的位置,这可不是我们想要的结果:

let bouncer = SKSpriteNode(imageNamed: "bouncer")
        bouncer.anchorPoint = CGPoint(x: 0.5, y: 0)
        bouncer.position = CGPoint(x: 0, y: -frame.size.height/2.0)

        bouncer.physicsBody = SKPhysicsBody(circleOfRadius: bouncer.size.width/2.0)

        addChild(bouncer)

在打开了物理调试选项之后运行App,我们可以清楚地看到实际发生了神马:

这里写图片描述

之所以Node会诡异悬空,是因为其物理对象的边界已卡位在屏幕底部了.那为什么Node边界和物理边界不对应呢?因为我们在代码中修改了它的锚点位置.

你可能以为物理对象也有诸如锚点之类的属性可以调整,但是并没有 :(

不过你可以在初始化物理对象的时候人肉定位其中心点,just like this:

bouncer.physicsBody = SKPhysicsBody(circleOfRadius: bouncer.size.width/2.0, center: CGPoint(x: 0, y: bouncer.size.height/2.0))

我来解释下一下center的含义:默认(0,0)是Node的中心位置,所以x不需要调整仍是0,不过y如上图所示,需要上移半个高度.

这里写图片描述

再次运行App,问题得以解决!

以上是关于SpriteKit改变Node锚点其物理对象位置不正确的解决的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit场景锚点影响子节点定位

在 spritekit 中使用 anchorPoint 到每个节点

在 SpriteKit 的 Flappy Bird 风格游戏中使用 self.speed 改变物理?

SpriteKit:无法在联系人回调中更改节点位置

iOS7 Sprite Kit如何在更改锚点时计算节点位置?

SpriteKit Pinball Flipper 行为