如何在点击时检查SKSpriteNode正在运行的SKTexture

时间:2016-04-18 02:14:48

标签: ios swift animation sprite-kit

我正在使用纹理数组来设置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")
    }

抱歉我的英文。

1 个答案:

答案 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)")
            }
        }
    }
}

可能还有更多方法可以实现这一目标。