gpt4 book ai didi

swift - 你如何在自定义类中获取 GameScene 的 frame.width?

转载 作者:搜寻专家 更新时间:2023-10-31 22:02:54 24 4
gpt4 key购买 nike

我在尝试将 GameScene 的 frame.width 放入自定义类时遇到问题,因为我需要场景宽度来在我的自定义类初始化中定位节点。

HudController.swift 片段

import SpriteKit

class HudController:SKNode {
var width:CGFloat

override init(){
width = GameScene().frame.width //I was hoping to add the scene width here
}
}

下面的代码在我身上崩溃了,我已经尝试了很多其他的解决方案,但都没有成功。

有人可以帮我解决这个问题吗?

谢谢!

更新代码 ===

GameScene.swift

import SpriteKit

class GameScene: SKScene {
var hud = HudController(gameScene: self)
// set as global because I'm using it to also call hud functions in my game

}

HudController.swift

import SpriteKit

class HudController:SKNode {

var width:CGFloat

init(gameScene:SKScene){
width = gameScene.size.width
}

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

最佳答案

SpriteKit 中的每个节点都可以使用 scene 属性检索它所在的场景。

let node = SKNode()
node.scene

scene属性返回一个SKScene?,该值是一个optional,因为如果当前节点不属于场景,则当然没有场景可以检索。

现在,您可能想在 HudController 的初始化程序中使用 self.scene 属性。

class HudController: SKNode {
var width:CGFloat

override init() {
super.init() // error: property 'self.width' not initialized at super.init call
width = self.scene!.frame.width
}

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

但它现在可以工作了,因为在初始化 width 属性之前您不能调用 super.init

好吧,那你可以试试这个。

class HudController: SKNode {
var width:CGFloat

override init() {
width = self.scene!.frame.width // error: use of 'self' in property access 'scene' before super.init initializes self

super.init()
}

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

再次出现编译错误,因为您在调用 super.init() 之前使用了 self

最后还有一个问题,当执行初始化器时,正在创建的节点还没有父节点,所以 self.scene 属性返回 nil.

如何解决?

解决方案

首先声明你的初始化器接收一个GameScene

class HudController: SKNode {
var width: CGFloat

init(gameScene:SKScene) {
width = gameScene.frame.width
super.init()
}

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

现在,当你创建这个对象时(我希望你是从场景或已经添加到场景的节点中创建的,否则我们就有麻烦了)你只需写

class Foo : SKNode {

func foo() {
guard let scene = self.scene else { return }
let controller = HudController(gameScene: scene)
}
}

另一方面,如果您从场景中创建 HudController,您只需编写:

class MyScene : SKScene {

override func didMoveToView(view: SKView) {
super.didMoveToView(view)
let controller = HudController(gameScene: self)
}
}

就是这样。

更新

如果你想在你的 GameScene 中有一个 HudController 的实例属性,这就是代码。

class HudController: SKNode {
var width: CGFloat

init(gameScene:SKScene) {
width = gameScene.frame.width
super.init() // <-- do not forget this
}

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

class GameScene: SKScene {
var hud : HudController?

override func didMoveToView(view: SKView) {
super.didMoveToView(view)
hud = HudController(gameScene: self)
}
}

关于swift - 你如何在自定义类中获取 GameScene 的 frame.width?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33054816/

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