1

以前,我通过在我的 SKScene 中创建初始化程序将属性传递到我的 SKScene,然后在我的 SceneEditViewController 中创建我的 SKScene 属性时设置这些初始化程序。这有意义吗?但愿如此。

但是,我现在使用的是场景编辑器,而不是手动创建 SKScene。我的动画场景有一个 SKLabelNode,我想将从不同的 viewController 接收到的文本传递到 SKScene 的 SKLabelNode。下面我在 if-else 的“if”部分提供了我以前的方法。在“其他”部分,我正在尝试新方法,但需要帮助。

当尝试从我的 SKScene 设置属性时,xcode 状态,“'SKScene' 类型的值没有成员'selectedTextSceneUse1'”

包括以下:

  • 场景编辑视图控制器
  • 扩展使我能够从另一个 viewController 接收文本字符串
  • GameScene.swift(连接到我的 GameScene.sks 的 swift 文件)

我正在使用 swift 5.0,如果您需要更多信息,请告诉我。

import UIKit
import Foundation
import SpriteKit
import GameplayKit

class SceneEditViewController: UIViewController, UITabBarControllerDelegate {

var selectedSceneTextFinal: String?

if selectedSceneInt == 0 {
            let animationScene3 = AnimationInventory18(size: CGSize(width:animationScreen.bounds.width, height:animationScreen.bounds.height), chosenChateracterSceneUse: chosenCharacterFinal, selectedTextSceneUse: selectedSceneTextFinal, chosenBackgroundSceneUse: chosenBackgroundFinal)
            
            animationScene3.scaleMode = .aspectFit
            animationScene3.backgroundColor = .black
            animationScene3.anchorPoint = CGPoint(x: 0.5, y: 0.52)
            animationScene3.position = CGPoint(x: 0, y: 0)
            let transition = SKTransition.fade(withDuration: 1.0)
            animationScreen.presentScene(animationScene3, transition: transition)
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 20){
                self.animationScreen.presentScene(nil)
                print("Scene Removed")
            }
        } else {
     
            if let scene = SKScene(fileNamed: "GameScene") as GameScene {
           
                scene.scaleMode = .aspectFit 
                
                scene.selectedTextSceneUse1 = selectedSceneTextFinal

                animationScreen.presentScene(scene)

                DispatchQueue.main.asyncAfter(deadline: .now() + 10){
                    self.animationScreen.presentScene(nil)
                    print("Scene Removed")
                }
            }
        }
    }

extension SceneEditViewController: textUpdateDelegate {
    func didUpdateText(textFromView: String){
        selectedSceneTextFinal = textFromView
    }
}


import SpriteKit
import GameplayKit

class GameScene: SKScene {
    
    var textNode: SKLabelNode?
    
   // Not receiving the value passed from selectedSceneTextFinal
   var selectedTextSceneUse1: String?
    

    // MARK: Camera Node
    let cameraNode = SKCameraNode()
    
    // Initializer 
     required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func check() {
        
        self.camera = cameraNode
        cameraNode.position = CGPoint(x: 0, y: -300)
        self.addChild(cameraNode)
        print(selectedTextSceneUse1)


        self.textNode?.text = selectedTextSceneUse1


    }
    
    override func sceneDidLoad() {

        self.lastUpdateTime = 0
        check()
    }

}


4

1 回答 1

3

你应该投射你的 SKScene :

if let scene = SKScene(fileNamed: "GameScene") as? GameScene {

在这些情况下,当您从文件中获取 GameScene 时,您需要实现 init?(coder..) :

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

请务必在 sks 文件中设置场景的类类型。(自定义类检查器)

如果要设置 sklabelnode 文本,然后更改,可以在 selectedSceneTextFinal 上添加观察者:

class SceneEditViewController: UIViewController, UITabBarControllerDelegate {

   var gameScene : GameScene?
   var selectedSceneTextFinal: String? {
       didSet {
           // Update gameScene value when controller value is changed
           gameScene?.selectedTextSceneUse1 = selectedSceneTextFinal
       }
   }
...

        if let scene = SKScene(fileNamed: "GameScene") as GameScene {
            gameScene = scene
            scene.scaleMode = .aspectFit 
            scene.selectedTextSceneUse1 = selectedSceneTextFinal
...


class GameScene: SKScene {

    var textNode: SKLabelNode?

   // Update textNode on update of selectedTextSceneUse1
   var selectedTextSceneUse1: String? {
       didSet {
           // If nit done initialise textNode from sks file (label node must have a name)
           if textNode == nil {
               textNode = childNode(withName: "name of LabelNode in sks file") as? SKLabelNode
           }
           textNode?.text = selectedTextSceneUse1
       }
   }
于 2021-02-25T18:56:18.273 回答