Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将变量从UIViewController传递到SK场景_Ios_Xcode_Swift_Uiview_Sprite Kit - Fatal编程技术网

Ios 将变量从UIViewController传递到SK场景

Ios 将变量从UIViewController传递到SK场景,ios,xcode,swift,uiview,sprite-kit,Ios,Xcode,Swift,Uiview,Sprite Kit,我正在使用Swift 2在XCode 7中制作一个a游戏。我有一个变量,我想从开始屏幕(UIViewController)传递到游戏场景(SKScene)。我希望玩家在UIView中选择一个角色,并在场景中使用它。我还想在游戏的屏幕上显示场景中的分数,这是一个UIView。我看过关于在两个UIViewController之间和两个场景之间传递数据的教程,但没有一个适用于这种情况 如何将变量从UIViewController传递到SKScene(反之亦然)?如果您还没有找到答案,我确实找到了一种方

我正在使用Swift 2在XCode 7中制作一个a游戏。我有一个变量,我想从开始屏幕(UIViewController)传递到游戏场景(SKScene)。我希望玩家在UIView中选择一个角色,并在场景中使用它。我还想在游戏的屏幕上显示场景中的分数,这是一个UIView。我看过关于在两个UIViewController之间和两个场景之间传递数据的教程,但没有一个适用于这种情况


如何将变量从UIViewController传递到SKScene(反之亦然)?

如果您还没有找到答案,我确实找到了一种方法。我也在做类似的事情

在我的例子中,我有一个UIView,它被称为场景中的暂停菜单。我已经使类和变量名更加模糊,以便它们也适用于您的情况

class MyView: UIView {
    var scene: MyScene!
    var button: UIButton!
    init(frame: CGRect, scene: MyScene){
        super.init(frame: frame)
        self.scene = scene
        //initialize the button
        button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "buttonTapped"))
    }

    func buttonTapped(){
        self.removeFromSuperview() // this removes my menu from the scene
        scene.doTheThing() // this calls the method on my scene
}
以下是我现场的相关部分

class MyScene: SKScene {

    func doTheThing(){
         //this is a function on the scene. You can pass any variable you want through the function. 
    }
}
在您的情况下,听起来第一个屏幕是UIView,第二个屏幕是SKScene

您可能希望首先创建场景,暂停它,然后在场景前面添加UIView。选择角色后,可以删除UIView并将角色添加到场景中


我希望这能回答你的问题。如果它不让我知道

我昨天也遇到了同样的问题

Swift 5.2、xcode 12和iOS 14。到处找。最终找到了SKScene的userData属性

注意:该应用程序基于SwiftUI,SKScene位于UIViewRepresentable中:

struct SpriteKitContainer: UIViewRepresentable {
    typealias UIViewType = SKView
    
    var skScene: SKScene!
    @Binding var timerData :  ModelProgressTimer
并不是说我正在将绑定传递到视图中——这包含了我想要使场景可用的许多数据项

我在两个地方放置了代码以填充skScene.userData:

func makeUIView(context: Context) -> SKView {
    self.skScene.scaleMode = .resizeFill
    self.skScene.backgroundColor = .green
    debugPrint("setting user data")

    self.skScene.userData = [:]
    self.skScene.userData!["color"] = UIColor(timerData.flatColorTwo!)
    self.skScene.userData!["running"] = timerData.isRunning
    self.skScene.userData!["percent"] = timerData.percentComplete

    let view = SKView(frame: .zero)
    view.preferredFramesPerSecond = 60
   // view.showsFPS = true
   // view.showsNodeCount = true
    view.backgroundColor = .clear
    view.allowsTransparency = true
    
    return view
}

func updateUIView(_ view: SKView, context: Context) {
    self.skScene.userData = [:]
    
    self.skScene.userData!["running"] = timerData.isRunning
    self.skScene.userData!["color"] = UIColor(timerData.flatColorTwo!)
    self.skScene.userData!["percent"] = timerData.percentComplete
    view.presentScene(context.coordinator.scene)
}
然后,在skScene对象中,我能够检索userData值:

   var item: SKShapeNode! = nil

   override func sceneDidLoad() {
       let scaleUp = SKAction.scale(by: 2.0, duration: 1.0)
       let scaleDown = SKAction.scale(by: 0.5, duration: 1.0)
        
       scaleUp.timingMode = .easeInEaseOut
       scaleDown.timingMode = .easeInEaseOut
       let sequence = SKAction.sequence([scaleUp,scaleDown])

       actionRepeat = SKAction.repeatForever(sequence)

       item = SKShapeNode(circleOfRadius: radius)
       addChild(item)
    }

override func didChangeSize(_ oldSize: CGSize) {

   item.fillColor = self.userData!["color"] as! UIColor
   item.strokeColor = .clear
                
   let meRunning = self.userData!["running"] as! Bool
                
   if meRunning {
         item.run(actionRepeat)        
   } else {
        item.removeAllActions()  
   }
}

如果在userdata中设置了“running”(运行)布尔值(布尔值),这将绘制一个“脉冲”圆圈。

应该是从视图控制器设置游戏场景变量的过程(查看视图控制器的代码以了解游戏场景的创建位置)。要在游戏场景的视图控制器中设置变量,请将对视图控制器的引用传递到游戏场景,然后使用视图控制器设置变量。呈现您的场景的SKView不是由视图控制器控制吗?这就像使用子视图一样。。。Gliderman有权idea@MaxKargin不,我实际上想做的是在UIView中选择一个角色,并在由SKScene文件控制的实际游戏中显示该角色。@Gabe12然后按我说的做(我手头没有Swift 2提供正确的语法,这就是为什么这是作为注释编写的)。在
SKScene
中创建一个方法或某物,该方法或某物接受一个字符串,并将其用作创建
SKSpriteNode
的文件名(或您正在使用的任何内容)。选择角色后,使用图像文件名调用该方法,然后开始运行游戏。您可能需要将一些代码从
didMoveToView
,但可能不需要太多。