【问题标题】:How do I reference sprites added in gamescene.sks in code like I would an IBOutlet?如何像在 IBOutlet 一样在代码中引用在 gamescene.sks 中添加的精灵?
【发布时间】:2017-11-17 03:08:04
【问题描述】:

我可以完全在代码中制作精灵,但我不知道如何将精灵放置在 gamescene.sks 中,然后在 gamescene.swift 中引用它以对其进行更改,就像我对 IBOutlet 一样。

我可以在 gamescene.sks 中使用名为“beam”的精灵来做到这一点:

 let beam = childNode(withName: "beam") as! SKSpriteNode

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    let touchLocation = touch!.location(in: self)
    let beam = childNode(withName: "beam") as! SKSpriteNode

    if let body = physicsWorld.body(at: touchLocation) {
        if body.node!.name == "leftTap" {

                beam.rotateBy(CGFloat(10))
                print("Began touch on Left")

        }else if body.node!.name == "rightTap"{

                beam.rotateBy(CGFloat(-10))
                print("Began touch on right")

        }
    }
}

}

它可以工作,我最初将精灵放在 gamescene.sks 中并在此处引用它。但是当我放置这条线时:

let beam = childNode(withName: "beam") as! SKSpriteNode

gamescene.swift 中的任何其他地方,它都会抛出错误,说我需要将其更改为:

let beam = SKSpriteNode(withName: "beam") as! SKSpriteNode

然后当我更改它时,我收到一条错误消息:“参数标签'(withName :)'不匹配任何可用的重载”

我是 sprite kit 的新手,希望得到一些建议!

【问题讨论】:

    标签: ios swift swift3 sprite-kit


    【解决方案1】:

    您需要将其作为惰性变量进行,self 尚不存在,这就是您的编译器抛出错误的原因

    lazy var beam = self.childNode(withName: "beam") as! SKSpriteNode

    如果这不起作用,请尝试:

    lazy var beam = { return self.childNode(withName: "beam") as! SKSpriteNode}()

    lazy 的作用是允许在需要时加载变量,而不是在初始化期间。

    您采用这种方法而不是将其作为局部变量的原因是为了优化。每次都在场景中搜索会很耗时,而只搜索一次显然不是。

    【讨论】:

    • 谢谢,这真的很有帮助!
    • 我尝试了您建议的两种方法并得到“gameScene has no member childNode error”
    • 那你有一个问题是gamescene不是skscene
    【解决方案2】:

    为什么不尝试将精灵放入局部变量中并在代码中引用该局部变量

    private var someObject = SKSpriteNode()
    
    override func didMove(to view: SKView) {
    
        if let someObjectNode = self.childNode(withName: "//someObject") as? SKSpriteNode {
            someObject = someObjectNode
            someObject.zPosition = 50
        }
    }
    

    然后在 touches 开始只引用 someObject 而不是每次都在 gameScene 中寻找对象。

    【讨论】:

    • 谢谢! “//someObject”应该是我在gamescene.sks中给精灵起的名字吗?这两个 // 是干什么用的?
    • 是的,这就是您在 SKS 场景文件中的名称。 // 是遍历所有子对象,无论是否嵌套在另一个对象中,都找到与该名称匹配的子对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多