我是初学者,并在Swift,iOS Xcode中组装了一个SpriteKit游戏。 GameViewController将值 name:String 传递给GameScene。 GameScene更新两个名为 apple.png 和 orange.png 的图像/ SKSpriteNodes。两个图像/ SKSpriteNodes占据大致相同的位置,因此它们不应重叠。但经过多次更新后,它们都重叠了。我有一个模糊的想法,即我创建的实例太多而实际上并没有更新但不幸的是,这是我的知识结束。
如何在每次更新时停止图像重叠?谢谢你的帮助。
func updateName(name: String) { // name:String is passed from gameViewController
var XYZ = SKSpriteNode(imageNamed: "\(name).png")
if (name == "apple") {
XYZ.anchorPoint = CGPointMake(...)
XYZ.position = CGPoint(...)
XYZ.setScale(...)
self.addChild(XYZ)
// animation of apple
} else if (name == "orange") {
XYZ.anchorPoint = CGPointMake(another set of ...)
XYZ.position = CGPoint(another set of ...)
XYZ.setScale(snother set of ...)
self.addChild(XYZ)
// animation of orange
}
}
答案 0 :(得分:2)
不是每次都添加一个子项,而是使用现有的spriteNode并更新纹理(当您声明您的sprite时,请确保设置name
属性以便您可以访问它们)。您的功能将如下所示:
func updateName(name: String) { // name:String is passed from gameViewController
var XYZ: SKSpriteNode = self.childNodeWithName("\(name)") as SKSpriteNode
if (name == "apple") {
XYZ.texture = //set texture however you'd like
// animation of apple
} else if (name == "orange") {
XYZ.texture = //set texture however you'd like
// animation of orange
}
}
这样您每次都不会创建越来越多的XYZ精灵,而是根据其名称获取相同的spriteNode来处理动画。此外,如果您同时拥有多个具有相同名称的精灵,则应该将精灵本身传递给函数以确保您拥有正确的实例。
希望这有帮助!如果您有疑问,请告诉我。
答案 1 :(得分:0)
在GameScene的开头,我像这样宣布了XYZ
XYZ = SKSpriteNode()
在函数内部,行
var XYZ: SKSpriteNode = self.childNodeWithName("\(name)") as SKSpriteNode
虽然
,但仍返回nil println("\(name)")
返回正确的名称。设置'name'属性是否意味着添加以下行?
name.name = "\(name)"