SKSpriteNode放置后位置变化

SKSpriteNode's position changes after placement

我遇到了 SKSpriteNode 的问题。当我把它放在场景中的某个位置后,它的位置开始变化得很慢。只有当我将 SKPhysicsBody 附加到它时才会发生这种情况,但不是没有它所以它与此有关。

这是我放置的图块的代码:

import Foundation
import SpriteKit

class Tile : SKNode {

    var sprite = SKSpriteNode(imageNamed: "grassMid")

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented");
    }


    override init() {
        super.init();
        self.sprite.physicsBody = SKPhysicsBody(texture: self.sprite.texture!, size: CGSize(width: 32.0, height: 32.0))
        self.sprite.physicsBody?.dynamic = false
        self.sprite.physicsBody?.collisionBitMask = 0x0
        self.addChild(sprite)
    }
}

这是放置对象的代码:

func addNewTile(position: CGPoint) {
        let t = Tile()
        t.sprite.position = getClosestPointInGrid(position)
        t.sprite.size = CGSize(width: 32.0, height: 32.0)
        if(!doesPositionContainTile(t.sprite.position)) {
             self.addChild(t)
        }
        print(t.sprite.position)
}

比如:我在位置(256, 32)放了一个方块,很快位置就变成了(255.990264892578, 31.9987831115723),而且一直在慢慢变化?我不明白。为什么会发生这种行为?

这种行为的发生是因为你已经为你的精灵添加了物理环境,所以这个涉及尊重你的 physicsWorldphysicsBody 设置的所有参数(重力,恢复,linearDamping , 摩擦..)。

事实上,使用 SKActions 是不正确的,因为您可能有像您这样的奇怪值。最好对您的精灵使用 addImpulsevelocity

希望它能帮助您了解项目中发生的事情。

好的。

我对这个问题做了一些研究,得出的结论是,如果一个 SKSpriteNode 是一个 SKNode 的父级,并且你将 SKSpriteNode 的 SKPhysicsObject 的动态 属性 设置为 false,该对象仍然会缓慢地保持漂移吃下。它根本不应该在动态 属性 设置为 false 的情况下移动。如果 SKSpriteNode 的父级是 SKScene,则不会出现此错误。

此错误于 2015 年 11 月 27 日在 Apple 开发者论坛 thread 中报告。据说它在 12 月 20 日仍然存在。我现在可以说它在 2016 年 7 月 10 日仍然存在。我有 Xcode 7.0 和 OS X 10.11.5,我只熟悉 spritekit 的 OS X 版本,我不知道这个错误是否也在 iOS 上。

最初我的地图系统是这样设计的,地图是SKNode,瓦片是SKSpriteNode。由于此错误,我对其进行了更改,以便将 SKSpriteNodes(tiles) 直接添加到 SKScene。现在bug没有出现了。