代码之家  ›  专栏  ›  技术社区  ›  E. Huckabee

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

  •  0
  • E. Huckabee  · 技术社区  · 7 年前

    我正在开发一个类来处理角色动画。动画将具有用户在角色创建中选择的不同肤色。每个肤色的地图集具有相同的名称,但存储在以下不同名称的文件夹中:

    image 1

    Image 2

    这在xcassets文件夹中

    这应该允许我的代码更加模块化,这样我就不必硬编码很多东西。我希望我的代码定位所选的skin tone文件夹及其子目录,以便在调用动画函数时播放正确的动画。

    目前的代码:

    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 回复  |  直到 7 年前
        1
  •  1
  •   E.Coms    7 年前

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

    因此,您只需为地图册指定一个唯一的名称,如:

    “male_pale_backLeft” “male_pale_backRight”

    “男tan_左后”

    如果任何文件名不唯一,则不会定义结果。也许你拿不到地图册。

    所以在这里 let textureAtlas = SKTextureAtlas(named: "\(base)") 如果基名称只是 back . 有多个备份,atlas加载失败。

    然后构成一个新文件名: SKTextureAtlas(named: "male_\(name)_\(base)") 会解决你的问题。

    希望你收到了。

    如果您更喜欢使用filePath,可以使用第二种方法而不使用。XC资产。

    提到 SKTextureAtlas.init(dictionary properties: [String : Any])

        2
  •  0
  •   E. Huckabee    7 年前

    在对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)

    Image 1

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

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