微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将字符串传递给 SKScene(filenamed:) 动画文件中的 SKLabelNode?

如何解决如何将字符串传递给 SKScene(filenamed:) 动画文件中的 SKLabelNode?

以前,我通过在 SKScene 中创建初始值设定项将属性传递到 SKScene,然后在我的 SceneEditViewController 中创建 SKScene 属性时设置这些初始值设定项。这样做有意义吗?我希望如此。

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

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

包括在下面:

  • SceneEditViewController
  • 扩展使我能够从另一个视图控制器接收文本字符串
  • 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()
    }

}


解决方法

你应该投射你的 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
       }
   }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。