我正在使用纹理数组来设置SKSpriteNode动画。一旦我点击我需要根据正在运行的ACTUAL纹理设置不同的动画(例如:使用0-5纹理动画,我点击此时的时候texture2是可见的,我检查WHICH纹理是否可见(texture2)然后做动画通讯(animation2)。
像纹理的名称之类的东西会用于检查,但我认为没有这样的属性。
我知道这种比较不起作用,但这是一个类似的演练的例子:
if(knightNode?.texture == SKTexture.init(imageNamed: "knightRunning01")){
knight?.removeActionForKey("walkAnimation")
knight?.runAction(SKAction.animateWithTextures(attackingFrames[0], timePerFrame: 0.4))
print("done")
}else if(knightNode?.texture == SKTexture.init(imageNamed: "knightRunning02")){
knight?.removeActionForKey("walkAnimation")
knight?.runAction(SKAction.animateWithTextures(attackingFrames[1], timePerFrame: 0.4))
print("done2")
}else{
print("hehe")
}
抱歉我的英文。
答案 0 :(得分:1)
在SKTexture上没有名为name的公共属性。此外,您无法通过扩展名添加名为id
的存储属性(无需进行任何黑客攻击)。并且不能子类化SKTexture以便在该新子类中添加存储的属性。这是来自docs:
子类注释
此类不能被子类化。
从未尝试过,但我可以想象,如果可能的话,这会有多大的问题(显然不是根据文档)。
所以解决方案......你可以将所有纹理存储在一个数组中,并在以后使用它来找出当前纹理的索引,如下所示:
import SpriteKit
class GameScene: SKScene{
var textures:[SKTexture] = []
var sprite:SKSpriteNode!
override func didMoveToView(view: SKView) {
let atlas = SKTextureAtlas(named: "yourAtlasName")
for i in 0...9 { textures.append(atlas.textureNamed(String(i))) }
sprite = SKSpriteNode(texture: textures[0])
sprite.position = CGPoint(x: frame.midX, y: frame.midY)
addChild(sprite)
let animation = SKAction.animateWithTextures(textures, timePerFrame: 2)
let loop = SKAction.repeatActionForever(animation)
sprite.runAction(loop, withKey: "aKey")
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let currentTexture = sprite.texture {
if let index = textures.indexOf(currentTexture) {
print("Index \(index)")
}
}
}
}
可能还有更多方法可以实现这一目标。