gpt4 book ai didi

swift - 为什么初始化(编码器:) being called when I provide an init() function

转载 作者:可可西里 更新时间:2023-11-01 00:57:08 25 4
gpt4 key购买 nike

我正在使用 SpriteKit,我正在加载一个 SceneKit 文件,其中包含许多带有自定义类的 Sprite 。场景实际上从未加载过,因为它到达第一个自定义类并从 required init?(coder:) 初始化程序中抛出 fatalerror。尽管自定义类实现了一个初始化器,但我无法确定为什么它选择该初始化器而不是我提供的初始化器。

自定义类:

class Bat: SKSpriteNode, GameSprite {
var initialSize: CGSize = CGSize(width: 44, height: 24)
var textureAtlas: SKTextureAtlas = SKTextureAtlas(named: "Enemies")
var flyAnimation = SKAction()

init() {
super.init(texture: nil, color: .clear, size: initialSize)

self.physicsBody = SKPhysicsBody(circleOfRadius: size.width / 2)
self.physicsBody?.affectedByGravity = false

createAnimations()
self.run(flyAnimation)
}

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

func createAnimations() {
let flyFrames: [SKTexture] = [textureAtlas.textureNamed("bat"),
textureAtlas.textureNamed("bat-fly")]

let flyAction = SKAction.animate(with: flyFrames, timePerFrame: 0.12)
flyAnimation = SKAction.repeatForever(flyAction)
}

func onTap() {}
}

下面是尝试加载场景然后遍历子项并初始化它们的代码:

遭遇经理:

class EncounterManager {
// Store encounter file names
let encounterNames: [String] = [
"EncounterA"
]

// Each encounter is a node, store an array
var encounters: [SKNode] = []

init() {
// Loop through each encounter scene and create a node for the encounter
for encounterFileName in encounterNames {
let encounterNode = SKNode()

// Load the scene file into a SKScene instance and loop through the children
if let encounterScene = SKScene(fileNamed: encounterFileName) {
for child in encounterScene.children {

// Create a copy of the scene's child node to add to our encounter node
// Copy the position, name, and then add to the encounter
let copyOfNode = type(of: child).init()
copyOfNode.position = child.position
copyOfNode.name = child.name
encounterNode.addChild(copyOfNode)
}
}

// Add the populated encounter node to the array
encounters.append(encounterNode)
}
}

// This function will be called from the GameScene to add all the encounter nodes to the world node
func addEncountersToScene(gameScene: SKNode) {
var encounterPosY = 1000

for encounterNode in encounters {
// Spawn the encounters behind the action, with increasing height so they do not collide
encounterNode.position = CGPoint(x: -2000, y: encounterPosY)
gameScene.addChild(encounterNode)

// Double Y pos for next encounter
encounterPosY *= 2
}
}
}

虽然我注意到使用断点的是它永远不会超过加载场景。它在 if let encounterScene = SKScene(fileNamed: encounterFileName) 行失败,错误是 Bat 类的初始化程序中的 fatal error 。

如果能帮助理解为什么它选择一个初始化器而不是另一个初始化器,我们将不胜感激!

最佳答案

你正在做:

 if let encounterScene = SKScene(fileNamed: encounterFileName)

调用 SKScene 的 init(fileNamed:) 加载文件并使用 SKScene 的编码器 init 对其进行解码。该 init 加载文件并使用节点的编码器 init 解码文件中的每个元素。

如果你想从一个文件加载,你需要实现coder init。

关于swift - 为什么初始化(编码器:) being called when I provide an init() function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44166252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com