在 Swift 4 中设置 SKSpriteNode 的位置
Setting Position of SKSpriteNode in Swift 4
所以在下面,我有一个 SKSpriteNode 图像,我还使用 Texture Atlas 沿 SKAction.animate 对我的纹理数组之一进行动画处理。当我第一次 运行 应用程序时,图像直接显示在屏幕中央,并按应有的方式进行动画处理。但是当我尝试通过 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) {
}
}
我还没有测试过这个,但我想我知道问题出在哪里。
您在代码的不同位置有这三行:
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
节点,然后设置其位置、zposition、大小等。要解决此问题,请考虑将 var person = SKSpriteNode()
替换为 var person: SKSpriteNode?
。然后也用 person = SKSpriteNode(imageNamed: atlas.textureNames[0])
替换 person = SKSpriteNode(imageNamed: “person1.png")
行,当然还要删除 for
循环之前出现的 person = SKSpriteNode(imageNamed: atlas.textureNames[0])
行。
由于 person
现在被定义为可选,现在需要将其作为 person?
访问,或者在您确定不能访问的情况下作为 person!
访问零。 Xcode 会告诉你在哪里需要添加额外的 ?
.
希望对您有所帮助!
所以在下面,我有一个 SKSpriteNode 图像,我还使用 Texture Atlas 沿 SKAction.animate 对我的纹理数组之一进行动画处理。当我第一次 运行 应用程序时,图像直接显示在屏幕中央,并按应有的方式进行动画处理。但是当我尝试通过 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) {
}
}
我还没有测试过这个,但我想我知道问题出在哪里。
您在代码的不同位置有这三行:
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
节点,然后设置其位置、zposition、大小等。要解决此问题,请考虑将 var person = SKSpriteNode()
替换为 var person: SKSpriteNode?
。然后也用 person = SKSpriteNode(imageNamed: atlas.textureNames[0])
替换 person = SKSpriteNode(imageNamed: “person1.png")
行,当然还要删除 for
循环之前出现的 person = SKSpriteNode(imageNamed: atlas.textureNames[0])
行。
由于 person
现在被定义为可选,现在需要将其作为 person?
访问,或者在您确定不能访问的情况下作为 person!
访问零。 Xcode 会告诉你在哪里需要添加额外的 ?
.
希望对您有所帮助!