放置后SKSpriteNode的位置会发生变化

时间:2016-07-07 21:37:51

标签: swift macos sprite-kit skspritenode skphysicsbody

我遇到了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)并且它会一直缓慢变化?我不明白。为什么会出现这种情况?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

好的。

我已就此问题做了一些研究,并得出结论,如果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版本,我不知道bug是否在iOS也。

最初我的地图系统的设计使得地图为SKNode,而瓷砖为SKSpriteNodes。由于这个错误,我更改了它,以便SKSpriteNodes(tile)直接添加到SKScene。现在这个错误并没有发生。