尝试将 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 专家,但如果你得到 imageToPass
到 GameViewController
,那么你应该能够在它呈现之前将它传递给 viewDidLoad 中的 GameScene。祝你好运。
注意 "GameScene.swift" 只是包含代码的文本文件的名称,因此您不会向其传递任何内容,class 是在 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,pickedImage 将不会通过,无论如何,但您不会崩溃。
编辑:顺便说一句,它真的应该是 GameSceneViewController
所以它在任何地方都很清楚它是一个视图控制器。如果它不是 View Controller,那就是一个问题,没有机会工作。
目标视图控制器是 UIViewController
或其子类。不是 SKScene
。所以我认为不能转换成GameScene
。 GameScene
通常是持有它的 UIViewController
的 属性。在我的项目中 UIViewController
被称为 GameViewController
。 GameViewController
有一个 属性 叫做 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)
}
我认为学习如何将图像从 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.swiftclass 游戏场景: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 专家,但如果你得到 imageToPass
到 GameViewController
,那么你应该能够在它呈现之前将它传递给 viewDidLoad 中的 GameScene。祝你好运。
注意 "GameScene.swift" 只是包含代码的文本文件的名称,因此您不会向其传递任何内容,class 是在 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,pickedImage 将不会通过,无论如何,但您不会崩溃。
编辑:顺便说一句,它真的应该是 GameSceneViewController
所以它在任何地方都很清楚它是一个视图控制器。如果它不是 View Controller,那就是一个问题,没有机会工作。
目标视图控制器是 UIViewController
或其子类。不是 SKScene
。所以我认为不能转换成GameScene
。 GameScene
通常是持有它的 UIViewController
的 属性。在我的项目中 UIViewController
被称为 GameViewController
。 GameViewController
有一个 属性 叫做 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)
}