在Swift 4中设置SKSpriteNode的位置

时间:2017-09-17 17:46:36

标签: swift sprite-kit skspritenode cgpoint

下面,我有一个SKSpriteNode图像,我也在使用SKAction.animate上的Texture Atlas动画,通过我的一个纹理数组进行动画处理。当我第一次运行应用程序时,图像直接显示在屏幕中央,并按照它应该的动画显示。但是当我尝试通过CGPoint定位节点时,它不会移动。我甚至试过,“ CGPoint(x:0,y:-self.height / 2)”,因为我希望图像显示在屏幕的最底部中心但不是工作。有时当我在iPhone上运行应用程序时,图像有时甚至不存在,我已经重新运行应用程序。我必须做一些非常错误但我的代码似乎没错?

class GameScene: SKScene {

    let background = SKSpriteNode(texture:SKTexture(imageNamed: "background"))

    var person = SKSpriteNode()

    let atlas = SKTextureAtlas(named: “people”)
    var textureArray = [SKTexture]()

    override func didMove(to view: SKView) {
        background.position = CGPoint(x: 0, y: 0)
        self.background.zPosition = 0.0
        self.addChild(background)

        person = SKSpriteNode(imageNamed: “person1.png")
        person.position = CGPoint(x: self.frame.size.width, y: self.frame.size.height/2)
        self.person.zPosition = 1.0
        person.size = CGSize(width: 150, height: 129)
        person = SKSpriteNode(imageNamed: atlas.textureNames[0])

        for i in 1...atlas.textureNames.count {
            let Name = “person\(i).png"
            textureArray.append(SKTexture(imageNamed: Name))
        }

        let myAnimation = SKAction.animate(with: textureArray, timePerFrame: 0.1)
        self.addChild(person)
        person.run(SKAction.repeatForever(myAnimation))

    }

    override func update(_ currentTime: TimeInterval) {

    }
}

1 个答案:

答案 0 :(得分:2)

我没有对此进行过测试,但我怀疑我知道问题出在哪里。

您在代码的不同位置有这三行:

var person = SKSpriteNode()

person = SKSpriteNode(imageNamed: “person1.png")

person = SKSpriteNode(imageNamed: atlas.textureNames[0])

所有这些行创建一个 new SKSpriteNode,并为一个名为person的变量保存的新精灵节点分配一个引用。

在您的代码中,您可以更改第二个person节点的位置。然后创建第3个person节点。这意味着您之前设置的位置不会对第3 person个节点产生任何影响,因为仅更改了第2 person个位置。

我建议只创建一个person节点,然后设置其位置,位置,大小等。要解决此问题,请考虑将var person = SKSpriteNode()替换为var person: SKSpriteNode?。然后还将行person = SKSpriteNode(imageNamed: “person1.png")替换为person = SKSpriteNode(imageNamed: atlas.textureNames[0]),当然也会删除person = SKSpriteNode(imageNamed: atlas.textureNames[0])循环之前发生的行for

由于person现已定义为可选项,因此现在需要将其作为person?person!进行访问,以确保它不能为零。 Xcode将显示您需要添加额外?的位置。

希望这有帮助!