如何正确设置SKSpriteNode子类的动画

时间:2016-08-04 18:36:46

标签: swift animation sprite-kit

我设计了一个SKSpriteNode子类<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ,我想知道如何使用几个不同的图像来动画它。我目前正在传递原始图片:

Ship

但我不确定如何在之后循环播放图像地图集。我首先尝试在类中使用一个方法,然后在class Ship:SKSpriteNode{ static var shipImage = SKTexture(imageNamed:"Sprites/fullShip.png") init(startPosition startPos:CGPoint, controllerVector:CGVector){ super.init(texture: Ship.shipImage, color: UIColor.clearColor(), size: Ship.shipImage.size()) 函数中调用:

update

func animateShip() { self.runAction(SKAction.repeatActionForever( SKAction.animateWithTextures(shipAnimationFrames, timePerFrame: 0.2, resize: false, restore: true)), withKey:"shipBlink") print("animate") } var shipAnimationFrames : [SKTexture]!上方声明,此块位于GameScene

didMoveToView

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:5)

纹理图集

首先,您需要在Assets.xcassets中创建纹理图集。你会在这里放置与你角色的帧相关的图像。

enter image description here

子类化SKSpriteNode

这是使用beginAnimation方法创建自己的精灵的方法

class Croc: SKSpriteNode {

    init() {
        let texture = SKTexture(imageNamed: "croc_walk01")
        super.init(texture: texture, color: .clearColor(), size: texture.size())
    }


    func beginAnimation() {
        let textureAtlas = SKTextureAtlas(named: "croc")
        let frames = ["croc_walk01", "croc_walk02", "croc_walk03", "croc_walk04"].map { textureAtlas.textureNamed($0) }
        let animate = SKAction.animateWithTextures(frames, timePerFrame: 0.1)
        let forever = SKAction.repeatActionForever(animate)
        self.runAction(forever)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

正如您所见,beginAnimation方法使用我之前在Assets.xcassets中创建的纹理图集的相同名称创建纹理图集。

然后创建一个纹理数组(frames)并用作参数来创建animate动作。

开始动画

现在你需要创建你的精灵并只调用一次beginAnimation。您不必在任何更新方法中调用beginAnimations,否则您将在每个新帧中创建一个新动画。这是错的。 beginAnimation只能被调用一次。

这是一个例子

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        let croc = Croc()
        croc.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
        addChild(croc)

        croc.beginAnimation()
    }
}

enter image description here