Ios 动画数组不为精灵设置动画

Ios 动画数组不为精灵设置动画,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我正在用SpriteKit用Swift制作一个简单的RPG。我写了一个角色类来帮助我处理所有的动画,我在动画方面遇到了一些问题 字符类: class Character: SKSpriteNode { var walkSouthArray = [SKTexture]() var walkNorthArray = [SKTexture]() var walkEastArray = [SKTexture]() var walkWestArray = [SKTextu

我正在用SpriteKit用Swift制作一个简单的RPG。我写了一个角色类来帮助我处理所有的动画,我在动画方面遇到了一些问题

字符类:

class Character: SKSpriteNode {

    var walkSouthArray = [SKTexture]()
    var walkNorthArray = [SKTexture]()
    var walkEastArray = [SKTexture]()
    var walkWestArray = [SKTexture]()

    override init(texture: SKTexture?, color: UIColor, size: CGSize) {
        super.init(texture: nil, color: UIColor.clear, size: CGSize(width: 100, height: 150))
        self = CGSize(width: 100, height: 150)
        self.position = CGPoint(x: 0, y: 0)
        self.texture = SKTexture(imageNamed: "walk_south_1")

        let northAtlas = SKTextureAtlas(named: "walk_north")
        var northFrames:[SKTexture] = []
        for index in 1 ... 8 {
            let textureName = "walk_north_\(index)"
            let texture = northAtlas.textureNamed(textureName)
            northFrames.append(texture)
            walkNorthArray = northFrames
        }

        let southAtlas = SKTextureAtlas(named: "walk_south")
        var southFrames:[SKTexture] = []
        for index in 1 ... 8 {
            let textureName = "walk_south_\(index)"
            let texture = southAtlas.textureNamed(textureName)
            southFrames.append(texture)
            walkSouthArray = southFrames
        }

        let eastAtlas = SKTextureAtlas(named: "walk_east")
        var eastFrames:[SKTexture] = []
        for index in 1 ... 8 {
            let textureName = "walk_east_\(index)"
            let texture = eastAtlas.textureNamed(textureName)
            eastFrames.append(texture)
            walkEastArray = eastFrames
        }

        let westAtlas = SKTextureAtlas(named: "walk_west")
        var westFrames:[SKTexture] = []
        for index in 1 ... 8 {
            let textureName = "walk_\(index)"
            let texture = westAtlas.textureNamed(textureName)
            westFrames.append(texture)
            walkWestArray = westFrames
        }


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

    func walkNorth() {
        self.run(SKAction.repeatForever(SKAction.animate(with: walkNorthArray, timePerFrame: 0.2)))
    }

    func walkSouth() {
        self.run(SKAction.repeatForever(SKAction.animate(with: walkSouthArray, timePerFrame: 0.2)))
    }

    func walkEast() {
        self.run(SKAction.repeatForever(SKAction.animate(with: walkEastArray, timePerFrame: 0.2)))
    }

    func walkWest() {
        self.run(SKAction.repeatForever(SKAction.animate(with: walkWestArray, timePerFrame: 0.2)))
    }
}
西行的框架还没有画出来

游戏场景类:

class GameScene: SKScene {
    var v = CGVector()

    var xJoystickDelta = CGFloat()
    var yJoystickDelta = CGFloat()

    var UINode = SKNode()
    var WorldNode = SKNode()

    var character = Character()

    var DPad = SKSpriteNode()
    var thumbNode = SKSpriteNode()

    var isTracking:Bool = false

    override func didMove(to view: SKView) {
        DPad = SKSpriteNode(texture: SKTexture(imageNamed: "base"))
        DPad.size = CGSize(width: 150, height: 150)
        DPad.position = CGPoint(x: -200, y: -100)
        DPad.zPosition = 3
        UINode.addChild(DPad)

        thumbNode = SKSpriteNode(texture: SKTexture(imageNamed: "stick"))
        thumbNode.size = CGSize(width: 50, height: 50)
        thumbNode.position = CGPoint(x: -200, y: -100)
        thumbNode.zPosition = 4
        UINode.addChild(thumbNode)

        self.addChild(UINode)
        self.addChild(character)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            if isTracking == false && DPad.contains(location) {
                isTracking = true
            }
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location: CGPoint = touch.location(in: self)
            if isTracking == true {

                v = CGVector(dx: location.x - DPad.position.x, dy: location.y - DPad.position.y)
                let angle = atan2(v.dy, v.dx)
                let deg = angle * CGFloat(180 / Double.pi)

                let Length:CGFloat = DPad.frame.size.height / 2
                let xDist: CGFloat = sin(angle - 1.57079633) * Length
                let yDist: CGFloat = cos(angle - 1.57079633) * Length

                xJoystickDelta = location.x - DPad.position.x
                yJoystickDelta = location.y - DPad.position.y

                if DPad.contains(location) {
                    thumbNode.position = location
                } else {
                    thumbNode.position = CGPoint(x: DPad.position.x - xDist, y: DPad.position.y + yDist)
                }
            }
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        isTracking = false
        thumbNode.run(SKAction.move(to: CGPoint(x: -200, y: -100), duration: 0.01))
        xJoystickDelta = 0
        yJoystickDelta = 0
    }

    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
        if v.dx > abs(v.dy) {
            // right
            character.walkEast()
        } else if v.dx < -abs(v.dy) {
            // left
            character.walkWest()
        } else if v.dy > 0 {
            // up
            character.walkNorth()
        } else if v.dy < 0 {
            // down
            character.walkSouth()
        }
    }
}
class游戏场景:SKScene{
var v=CGVector()
var xJoystickDelta=CGFloat()
var yJoystickDelta=CGFloat()
var UINode=SKNode()
var WorldNode=SKNode()
var character=character()
var DPad=SKSpriteNode()
var thumbNode=SKSpriteNode()
变量isTracking:Bool=false
覆盖func didMove(到视图:SKView){
DPad=SKSpriteNode(纹理:SKTexture(图像名称:“base”))
DPad.size=CGSize(宽:150,高:150)
DPad.position=CGPoint(x:-200,y:-100)
DPad.zPosition=3
UINode.addChild(DPad)
thumbNode=SKSpriteNode(纹理:SKTexture(图像名称:“stick”))
thumbNode.size=CGSize(宽:50,高:50)
thumbNode.position=CGPoint(x:-200,y:-100)
thumbNode.zPosition=4
UINode.addChild(拇指节点)
self.addChild(UINode)
self.addChild(字符)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
如果isTracking==false&&DPad.contains(位置){
isTracking=true
}
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
接触{
让位置:CGPoint=touch.location(in:self)
如果isTracking==true{
v=CGVector(dx:location.x-DPad.position.x,dy:location.y-DPad.position.y)
让角度=atan2(v.dy,v.dx)
让deg=角度*CGFloat(180/Double.pi)
let Length:CGFloat=DPad.frame.size.height/2
设xDist:CGFloat=sin(角度-1.57079633)*长度
让yDist:CGFloat=cos(角度-1.57079633)*长度
xJoystickDelta=location.x-DPad.position.x
yJoystickDelta=location.y-DPad.position.y
如果DPad.contains(位置){
thumbNode.position=位置
}否则{
thumbNode.position=CGPoint(x:DPad.position.x-xDist,y:DPad.position.y+yDist)
}
}
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
isTracking=false
thumbNode.run(SKAction.move(到:CGPoint(x:-200,y:-100),持续时间:0.01))
xJoystickDelta=0
yJoystickDelta=0
}
覆盖函数更新(uCurrentTime:TimeInterval){
//在渲染每个帧之前调用
如果v.dx>abs(v.dy){
//对
character.walkEast()
}否则,如果v.dx<-abs(v.dy){
//左
character.walkWest()
}否则,如果v.dy>0{
//向上
character.walkNorth()
}否则,如果v.dy<0{
//向下
character.walkSouth()
}
}
}
它的设置是这样的,所以我所要做的就是调用动画的函数。当我称之为它们时,我得到的只是一张静止图像(地图集中的第一张图像)

据我所知,我的地图集设置正确:


我单击“+”按钮并选择“New Sprite Atlas”,然后将我的图像拖放到新文件夹中并重命名它。

在更新周期中执行操作时务必小心

此操作以60 FPS的速度运行,这是大多数设备的默认速度,因此其中的任何命令都将以该速度启动

在您的特定情况下,您在每次更新时都会添加一个新的动画动作,因此就应用程序而言,它正在绘制动画,但您会继续向混合添加一个新的开始动画

由于您没有“X射线”视觉,因此无法通过最上面的动画层看到下面绘制的其他动画。(当然,这只是概念上的,系统并没有将层堆叠在彼此的顶部)

我建议您更改代码,以便只调用一次动画,并将其从更新周期中删除

我喜欢遵守的一条好规则是:

如果不是每帧都发生更改,则不要在更新函数中包含处理更改的代码

这意味着消除浪费时间的if-then检查,如
if v.dx>abs(v.dy)
,因为如果
v.dx
v.dy
,则不需要检查每个帧,我们只需要在
dx
dy
更改时检查

在您的情况下,这发生在
touchedMoved
事件期间

在此函数中更改v后,执行更新函数中的代码以运行动画

当然,您还需要删除其他移动动作,这样您就不会同时执行动作

您的代码应该如下所示:

class GameScene: SKScene {
    enum Direction
    {
       case none
       case up
       case down
       case left
       case right
    }
    var charDir = Direction.none
    var v = CGVector()

    var xJoystickDelta = CGFloat()
    var yJoystickDelta = CGFloat()

    var UINode = SKNode()
    var WorldNode = SKNode()

    var character = Character()

    var DPad = SKSpriteNode()
    var thumbNode = SKSpriteNode()

    var isTracking:Bool = false

    override func didMove(to view: SKView) {
        DPad = SKSpriteNode(texture: SKTexture(imageNamed: "base"))
        DPad.size = CGSize(width: 150, height: 150)
        DPad.position = CGPoint(x: -200, y: -100)
        DPad.zPosition = 3
        UINode.addChild(DPad)

        thumbNode = SKSpriteNode(texture: SKTexture(imageNamed: "stick"))
        thumbNode.size = CGSize(width: 50, height: 50)
        thumbNode.position = CGPoint(x: -200, y: -100)
        thumbNode.zPosition = 4
        UINode.addChild(thumbNode)

        self.addChild(UINode)
        self.addChild(character)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            if isTracking == false && DPad.contains(location) {
                isTracking = true
            }
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location: CGPoint = touch.location(in: self)
            if isTracking == true {

                v = CGVector(dx: location.x - DPad.position.x, dy: location.y - DPad.position.y)
                var newDirection = Direction.none
                if v.dx > abs(v.dy) {
                  // right
                  newDirection = .right
                } else if v.dx < -abs(v.dy) {
                  // left
                  newDirection = .left
                } else if v.dy > 0 {
                // up
                  newDirection = .up
                } else if v.dy < 0 {
                // down
                  newDirection = .down
                }                    
                if charDir != newDirection
                {
                  charDir = newDirection
                  character.removeAllActions()
                  switch charDir{
                    case .right: character.walkEast()
                    case .left:  character.walkWest()
                    case .up:    character.walkNorth()
                    case .down:  character.walkSouth()
                    default: break
                  }
                }
                let angle = atan2(v.dy, v.dx)
                let deg = angle * CGFloat(180 / Double.pi)

                let Length:CGFloat = DPad.frame.size.height / 2
                let xDist: CGFloat = sin(angle - 1.57079633) * Length
                let yDist: CGFloat = cos(angle - 1.57079633) * Length

                xJoystickDelta = location.x - DPad.position.x
                yJoystickDelta = location.y - DPad.position.y

                if DPad.contains(location) {
                    thumbNode.position = location
                } else {
                    thumbNode.position = CGPoint(x: DPad.position.x - xDist, y: DPad.position.y + yDist)
                }
            }
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        isTracking = false
        thumbNode.run(SKAction.move(to: CGPoint(x: -200, y: -100), duration: 0.01))
        xJoystickDelta = 0
        yJoystickDelta = 0
    }

    override func update(_ currentTime: TimeInterval) {

    }
}
class游戏场景:SKScene{
枚举方向
{
无案例
开箱
结案
案例左
案例权利
}
var charDir=Direction.none
var v=CGVector()
var xJoystickDelta=CGFloat()
var yJoystickDelta=CGFloat()
var UINode=SKNode()
var WorldNode=SKNode()
var character=character()
var DPad=SKSpriteNode()
var thumbNode=SKSpriteNode()
变量isTracking:Bool=false
覆盖func didMove(到视图:SKView){
DPad=SKSpriteNode(纹理:SKTexture(图像名称:“base”))
DPad.size=CGSize(宽:150,高:150)
DPad.position=CGPoint(x:-200,y:-100)
DPad.zPosition=3
UINode.addChild(DPad)
thumbNode=SKSpriteNode(纹理:SKTexture(图像名称:“stick”))
thumbNode.size=