Swift 如何将字符串传递到SKScene(文件名:)动画文件中的SKLabelNode?
以前,我通过在SKScene中创建初始值设定项将属性传递到SKScene,然后在SceneEditViewController中创建SKScene属性时设置这些初始值设定项。这有意义吗?我希望如此 但是,我现在使用的不是手动创建场景,而是场景编辑器。我的动画场景有一个SKLabelNode,我想将从不同的viewController接收的文本传递到该场景的SKLabelNode。下面我在if-else的“if”部分提供了我以前的方法。在“else”部分,我正在尝试新方法,但需要帮助 当尝试从我的SKScene设置属性时,xcode声明,“类型为'SKScene'的值没有成员'selectedTextSceneUse1'” 包括以下内容:Swift 如何将字符串传递到SKScene(文件名:)动画文件中的SKLabelNode?,swift,sprite-kit,sklabelnode,sceneeditor,Swift,Sprite Kit,Sklabelnode,Sceneeditor,以前,我通过在SKScene中创建初始值设定项将属性传递到SKScene,然后在SceneEditViewController中创建SKScene属性时设置这些初始值设定项。这有意义吗?我希望如此 但是,我现在使用的不是手动创建场景,而是场景编辑器。我的动画场景有一个SKLabelNode,我想将从不同的viewController接收的文本传递到该场景的SKLabelNode。下面我在if-else的“if”部分提供了我以前的方法。在“else”部分,我正在尝试新方法,但需要帮助 当尝试从我的
- SceneEditViewController
- 允许我从另一个viewController接收文本字符串的扩展
- GameSecene.swift(连接到my GameSecene.sks的swift文件)
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()
}
}
你应该在以下场景中施展你的技巧:
if let scene = SKScene(fileNamed: "GameScene") as? GameScene {
在这些情况下,当您从文件中获取游戏场景时,您需要实现init?(编码器..):
确保也在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
}
}
你应该在以下场景中施展你的技巧:
if let scene = SKScene(fileNamed: "GameScene") as? GameScene {
在这些情况下,当您从文件中获取游戏场景时,您需要实现init?(编码器..):
确保也在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
}
}
您的意思是在Identity and Type下的“Show the File inspector”(显示文件检查器)中?否,在自定义类inspectori中,我必须删除该检查,因为我要将字符串传输到的属性(selectedTextSceneUse1)返回为nil。游戏场景文件中我的初始化设置是否有问题?我现在收到一个致命错误。我甚至需要初始化设置吗?我忘了你必须编码init:init?(编码器…):它必须调用super.init(编码器…)谢谢。但是我不确定我是否理解。你是说在Identity and Type下的“Show the File inspector”(显示文件检查器)中?不,在自定义类inspectori中,我必须删除检查,因为我要将字符串传输到的属性(selectedTextSceneUse1)返回为nil。游戏场景文件中我的初始化设置是否有问题?我现在收到一个致命错误。我甚至需要初始化设置吗?我忘了你必须编码init:init?(编码器…):它必须调用super.init(编码器…)谢谢。我不确定我是否理解。@RonMyschuk你过去真的很有帮助,希望你能提供帮助或澄清我遗漏的内容。@RonMyschuk你过去真的很有帮助,希望你能提供帮助或澄清我遗漏的内容。