SKTextureAtlas - перейдите по пути к атласу вместо того, чтобы искать этот конкретный атлас - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над классом для обработки анимации персонажей. Анимации будут иметь различные тона кожи, которые пользователь выбирает при создании персонажа. Атласы для каждого из тонов кожи имеют одно и то же имя, но хранятся в папках с разными именами, например:

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 голосов
/ 08 ноября 2018

Проведя дополнительные исследования файловой структуры 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.)

Это почти то, что мне было нужно.

0 голосов
/ 07 ноября 2018

Все оценки в .XCAssets управляются в режиме NSSet по соображениям скорости. Другими словами, в файле нет концепции пути, и каждое имя должно быть уникальным.

Так что вам нужно только присвоить атласу уникальное имя, например:

"male_pale_back" "Male_pale_backLeft" "Male_pale_backRight"

"male_tan_back" "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])

...