尝试将 UIImage 从一个 ViewController 传递到我在 spriteKit 中的 GameScene

Trying to pass UIImage from one ViewController to my GameScene in spriteKit

我认为学习如何将图像从 imagePicker 传递到我的 GameScene 以用作 SKSpriteNode(texture: SKTexture(image: UIImage)) 会很有趣,但是在选择我的图像和按一个按钮进入我的游戏场景

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "startSegue") {

        var gameViewController = segue.destinationViewController as GameScene

        gameViewController.imageToPass = pickedImage.image

    }

有人知道我做错了什么吗?

继续获取 exc_breakpoint(代码=exc_i386_bpt,子代码 0x0) 当将 gameViewController 初始化为 GameScene

我正在尝试将 imageToPass 传递给在 Xcode

中创建新游戏项目时创建的 GameScene.swift

class 游戏场景:SKScene {

var imageToPass = UIImage()
var bird = SKSpriteNode()


override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    var birdTexture = SKTexture(image: imageToPass)
    bird = SKSpriteNode(texture: birdTexture)
    bird.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))

    self.addChild(bird)
}

在默认的 SpriteKit 实现中,创建的 View Controller 是 GameViewController。在 Interface Builder 中,它的视图有一个 SKView。在 viewDidLoad 中,关键行是

if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
    // Configure the view.
    let skView = self.view as SKView 
    /* more setup */
    skView.presentScene(scene)
}

您似乎已经编辑了您的问题以反映这一点。我不是 SpriteKit 专家,但如果你得到 imageToPassGameViewController,那么你应该能够在它呈现之前将它传递给 viewDidLoad 中的 GameScene。祝你好运。

注意 "GameScene.swift" 只是包含代码的文本文件的名称,因此您不会向其传递任何内容,class 是在 class GameScene: SKScene { /* class properties and methods */ 中创建的

原答案:

您确定 destinationViewControllerGameScene 吗? 真的确定吗?因为您正在使用 as,所以您强制将 segue 视图控制器向下转换为 "GameScene"。

利用 Swift 的安全功能:

if var gameViewController = segue.destinationViewController as? GameScene {
    gameViewController.imageToPass = pickedImage.image
}

或使用可选链接:

var gameViewController = segue.destinationViewController as? GameScene
gameViewController?.imageToPass = pickedImage.image

如果不是 GameScene,pickedImage 将不会通过,无论如何,但您不会崩溃。

编辑:顺便说一句,它真的应该是 GameSceneViewController 所以它在任何地方都很清楚它是一个视图控制器。如果它不是 View Controller,那就是一个问题,没有机会工作。

目标视图控制器是 UIViewController 或其子类。不是 SKScene。所以我认为不能转换成GameSceneGameScene 通常是持有它的 UIViewController 的 属性。在我的项目中 UIViewController 被称为 GameViewControllerGameViewController 有一个 属性 叫做 gameScene

所以代码应该是

if let gameViewController = segue.destinationViewController as? GameViewController
{
    gameViewController.imageToPass = pickedImage.image
}

在名为 imageToPass 的 GameViewController 中创建一个 属性。在 viewDidLoad.

中将 imageToPass 设置为 GameScene.imageToPass
class GameViewController: UIViewController {

    var pickedImage : UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
            let skView = self.view as SKView
            skView.showsFPS = true
            skView.showsNodeCount = true

            skView.ignoresSiblingOrder = true

            scene.scaleMode = .AspectFill

            scene.imageToPass = pickedImage

            skView.presentScene(scene)
        }
    }
}

您可以在 imageToPass 上创建一个 属性 观察器以动态更改它。

var bird : SKSpriteNode!

var imageToPass : UIImage!
    {
    didSet
    {
        createBird()
    }
}

func createBird()
{
    var birdTexture = SKTexture(image: imageToPass)
    bird?.removeFromParent()
    bird = SKSpriteNode(texture: birdTexture)
    bird.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))

    self.addChild(bird)
}