SKTextureAtlas-传递路径到地图集,而不是查找特定的地图集

时间:2018-11-07 09:52:01

标签: ios swift sprite-kit

我正在上一堂课来处理角色动画。动画将具有用户在角色创建中选择的不同肤色。每个肤色图集都有相同的名称,但存储在不同名称的文件夹中,如下所示:

image 1

Image 2

这在xcassets文件夹中

这应该使我的代码更具模块化,因此我不必硬编码很多东西。我希望我的代码找到所选的肤色文件夹及其子目录,以便在调用动画功能时播放正确的动画。

到目前为止的当前代码:

class Character : SKNode {
    let character: SKSpriteNode
    let base: String
    var textureArray = [SKTexture]()

    init(Base: String) {
        character = SKSpriteNode(texture: nil, size: CGSize(width: 30, height: 44))
        base = Base
        super.init()

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

    func northAnimation() {
        let textureAtlas = SKTextureAtlas(named: "\(base)")
        var frames:[SKTexture] = []

        for index in 1 ... 6 {
            let textureName = textureAtlas.textureNamed("back_\(index)")
            let texture = textureName
            textureArray = frames

            character.removeAllActions()
            character.run(SKAction.repeatForever(SKAction.animate(with: textureArray, timePerFrame: 0.2)))
        }
    }
}

在该类的init中,目标是插入文件夹的名称(该名称将根据字符创建而设置),然后访问相应的地图集。我在弄清楚如何找到通往地图集位置的正确路径时遇到了麻烦。

我如何传递到地图集的路径,而不是查找特定的地图集?

2 个答案:

答案 0 :(得分:1)

出于速度原因,.XCAssets中的所有资产都以NSSet模式进行管理。换句话说,文件中没有路径概念,并且每个名称都应该是唯一的。

因此,您只需为地图集分配一个唯一的名称,例如:

“雄性变回” “ male_pale_backLeft” “ male_pale_backRight”

“雄性背” “ male_tan_backLeft” “ male_tan_backRight”

如果任何文件名不是唯一的,则结果未定义。可能您看不到地图集。

因此,如果基本名称仅为let textureAtlas = SKTextureAtlas(named: "\(base)"),请在这里back。背部不止一个,地图集的加载失败。

首先更改图集中的文件名。 然后创建一个新的文件名:SKTextureAtlas(named: "male_\(name)_\(base)")将解决您的问题。

希望你明白了。

如果您喜欢使用filePath,可以使用第二种方法,而不要使用.XCASSets。

请参阅SKTextureAtlas.init(dictionary properties: [String : Any])

答案 1 :(得分:0)

在对Swift的文件结构进行了更多研究之后,并研究了其他具有类似动画的游戏,我很快发现我想要的东西是不可能的。我想出了另一种与我的问题类似但不完全相同的方法。

这是更改后的代码。这段代码是非常模块化的,应该可以播放我需要播放的所有动画。

import Foundation
import SpriteKit

class Character : SKNode {
    let character: SKSpriteNode
    let gender: String
    let tone: String
    var textureArray = [SKTexture]()

    init(Tone: String, Gender: String) {
        character = SKSpriteNode(texture: nil, size: CGSize(width: 45, height: 66))
        gender = Gender
        tone = Tone

        super.init()

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

    func moveAnimation(direction: String) {
        let textureAtlas = SKTextureAtlas(named: "\(gender)_\(tone)_\(direction)")
        var frames:[SKTexture] = []

        for index in 1 ... 6 {
            let textureName = textureAtlas.textureNamed("\(gender)_\(tone)_\(direction)_\(index)")
            let texture = textureName
            frames.append(texture)
            textureArray = frames

            character.removeAllActions()
            character.run(SKAction.repeatForever(SKAction.animate(with: textureArray, timePerFrame: 0.1)))
        }
    }
}

我想出了一种文件夹命名格式(碰巧与@E。Coms的答案非常匹配,但是有一些区别,我在他出书前约8个小时就提出了)。 ,性别和肤色。格式为\(gender)_\(tone)_\(direction),因此我的Atlas文件夹命名为:

Image 1

每个肤色都将被命名为male_tan, male_dark而不是male_pale,因此地图集不会相互混淆。

当我初始化一个新角色时,我会选择肤色和性别。当我调用动画功能时,我选择了一个方向(back, backLeft, forward, etc.

这几乎是我所需要的。