我正在上一堂课来处理角色动画。动画将具有用户在角色创建中选择的不同肤色。每个肤色图集都有相同的名称,但存储在不同名称的文件夹中,如下所示:
这在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
中,目标是插入文件夹的名称(该名称将根据字符创建而设置),然后访问相应的地图集。我在弄清楚如何找到通往地图集位置的正确路径时遇到了麻烦。
我如何传递到地图集的路径,而不是查找特定的地图集?
答案 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文件夹命名为:
每个肤色都将被命名为male_tan, male_dark
而不是male_pale
,因此地图集不会相互混淆。
当我初始化一个新角色时,我会选择肤色和性别。当我调用动画功能时,我选择了一个方向(back, backLeft, forward, etc.
)
这几乎是我所需要的。