我设计了一个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
任何帮助都会很棒!
答案 0 :(得分:5)
首先,您需要在Assets.xcassets
中创建纹理图集。你会在这里放置与你角色的帧相关的图像。
这是使用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()
}
}