试图将UIImage从一个ViewController传递到spriteKit中的GameScene

时间:2015-01-30 00:06:44

标签: ios iphone swift

我认为学习如何将图像从imagePicker传递到我的GameScene以用作SKSpriteNode(纹理:SKTexture(图像:UIImage))会很有趣但是在选择我的图像并按下后仍然出现错误按钮进入我的gameScene

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

类GameScene: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)
}

2 个答案:

答案 0 :(得分:0)

在默认的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专家,但是如果你imageToPass获得GameViewController,那么你应该能够在它出现之前将它传递给viewDidLoad中的GameScene。祝好运。

注意" GameScene.swift"只是包含代码的文本文件的名称,因此您不会向其传递任何内容,该类在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,pickImage将无法通过,但是你不会发生崩溃。

编辑:顺便说一下,它确实应该是GameSceneViewController所以它在任何地方都是明确的,它是一个视图控制器。如果它不是视图控制器,那就是一个问题,没有机会工作。

答案 1 :(得分:0)

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

的属性

所以代码应该是

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

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

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)
}