我认为学习如何将图像从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)
}
答案 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 */
您确定destinationViewController
是GameScene
吗? 真的肯定吗?因为您正在使用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
。所以我不认为它可以转换为GameScene
。 GameScene
通常是拥有它的UIViewController
的属性。在我的项目中,UIViewController
被称为GameViewController
。 GameViewController
有一个名为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)
}