更改 SKSpriteNode 子类的纹理?
Changing texture for subclass of SKSpriteNode?
下面class中的update
函数,是SKSpriteNode的子class,应该改变class的纹理。根据 this SO answer,更新 texture
属性 足以改变 SKSpriteNode 的纹理。但是,此代码不起作用。
知道为什么吗?
class CharacterNode: SKSpriteNode {
let spriteSize = CGSize(width: 70, height: 100)
var level = 0
init(level: Int) {
self.level = level
super.init(texture: nil, color: UIColor.clear, size: spriteSize)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func update(level: Int) {
self.level = level
self.texture = textureForLevel(level: level)
}
func textureForLevel(level: Int) -> SKTexture {
return SKTexture(imageNamed: "TestTexture")
}
您的代码运行良好。事实上这个 SO answer 是正确的。
关于SKSpriteNode
子class,update
方法是您新添加的自定义函数,因为实例方法update(_:)只对[=13]有效=] class,这里只是说如果不显式调用这个函数是不会执行的。
要对您的 class 进行测试,您可以按以下方式更改代码(我只更改了 textureForLevel
方法来制作此示例):
class CharacterNode: SKSpriteNode {
let spriteSize = CGSize(width: 70, height: 100)
var level = 0
init(level: Int) {
self.level = level
super.init(texture: nil, color: UIColor.clear, size: spriteSize)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func update(level: Int) {
self.level = level
self.texture = textureForLevel(level: level)
}
func textureForLevel(level: Int) -> SKTexture {
if level == 3 {
return SKTexture(imageNamed: "TestTexture3.jpg")
}
return SKTexture(imageNamed: "TestTexture.jpg")
}
}
class GameScene: SKScene {
override func didMove(to view: SKView) {
let characterNode = CharacterNode(level:2)
characterNode.update(level:2)
addChild(characterNode)
characterNode.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
characterNode.run(SKAction.wait(forDuration: 2.0), completion: {
characterNode.update(level:3)
})
}
}
正如您在启动时看到的那样 GameScene
角色节点精灵将显示在屏幕中央。 2秒后,材质会发生变化
下面class中的update
函数,是SKSpriteNode的子class,应该改变class的纹理。根据 this SO answer,更新 texture
属性 足以改变 SKSpriteNode 的纹理。但是,此代码不起作用。
知道为什么吗?
class CharacterNode: SKSpriteNode {
let spriteSize = CGSize(width: 70, height: 100)
var level = 0
init(level: Int) {
self.level = level
super.init(texture: nil, color: UIColor.clear, size: spriteSize)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func update(level: Int) {
self.level = level
self.texture = textureForLevel(level: level)
}
func textureForLevel(level: Int) -> SKTexture {
return SKTexture(imageNamed: "TestTexture")
}
您的代码运行良好。事实上这个 SO answer 是正确的。
关于SKSpriteNode
子class,update
方法是您新添加的自定义函数,因为实例方法update(_:)只对[=13]有效=] class,这里只是说如果不显式调用这个函数是不会执行的。
要对您的 class 进行测试,您可以按以下方式更改代码(我只更改了 textureForLevel
方法来制作此示例):
class CharacterNode: SKSpriteNode {
let spriteSize = CGSize(width: 70, height: 100)
var level = 0
init(level: Int) {
self.level = level
super.init(texture: nil, color: UIColor.clear, size: spriteSize)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func update(level: Int) {
self.level = level
self.texture = textureForLevel(level: level)
}
func textureForLevel(level: Int) -> SKTexture {
if level == 3 {
return SKTexture(imageNamed: "TestTexture3.jpg")
}
return SKTexture(imageNamed: "TestTexture.jpg")
}
}
class GameScene: SKScene {
override func didMove(to view: SKView) {
let characterNode = CharacterNode(level:2)
characterNode.update(level:2)
addChild(characterNode)
characterNode.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
characterNode.run(SKAction.wait(forDuration: 2.0), completion: {
characterNode.update(level:3)
})
}
}
正如您在启动时看到的那样 GameScene
角色节点精灵将显示在屏幕中央。 2秒后,材质会发生变化