首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用动态加载的presentScene(_withTransition:incomingPointOfView ( SceneKit completionHandler)崩溃

使用动态加载的presentScene(_withTransition:incomingPointOfView ( SceneKit completionHandler)崩溃
EN

Stack Overflow用户
提问于 2015-12-27 15:56:59
回答 2查看 1.1K关注 0票数 2

我试图从一个场景过渡到另一个场景,但是当我调用presentScene时,会有一个崩溃!场景不是存储在类中或引用中,而是直接加载到presentScene调用中。

Xcode中的崩溃屏幕截图:

我的简单的最小项目在这里:https://dl.dropboxusercontent.com/u/6979623/SceneKitTransitionTest.zip

MKScene只是SCNScene的一个子类,因为我想知道什么时候可以确定场景是这样的。

代码语言:javascript
复制
self.gameView!.scene = MKScene(named:"art.scnassets/scene1.scn")

然后我再打电话

代码语言:javascript
复制
let scnView:SCNView = self.gameView! as SCNView
let skTransition:SKTransition = SKTransition.crossFadeWithDuration(1.0)
skTransition.pausesIncomingScene = false
skTransition.pausesOutgoingScene = false
self.sceneToggler = !self.sceneToggler
// transition
scnView.presentScene((self.sceneToggler ? MKScene(named:"art.scnassets/scene1.scn")! : MKScene(named:"art.scnassets/scene2.scn")!), withTransition:skTransition, incomingPointOfView:nil, completionHandler:nil)

如果我在课堂上引用这个场景的话,它就会奏效--但这不是我想要的。我只想转换到另一个场景,把当前的场景抛在脑后。

为什么这会崩溃?这似乎是一个简单的任务…

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-27 23:29:22

这是SceneKit中的一个bug。解决办法:在调用"presentScene“之前保持对传出场景的引用,并在调用之后释放它。

票数 3
EN

Stack Overflow用户

发布于 2015-12-28 00:18:50

我用一个比较简单的项目重现了你的崩溃。它不使用MKScene,也不使用通知来触发转换。它在第二次尝试加载时崩溃。

我已经在https://bugreport.apple.com上将其归档为rdar://24012973,这是我想骗你的,还有你的更长的项目。

这是我的简化ViewController.swift。在SCNScene属性(第25/29行)之间切换或在运行负载(第24/28行)之间切换,在正确和崩溃行为之间切换。那是,

代码语言:javascript
复制
        nextScene = SCNScene(named:"art.scnassets/scene2.scn")!

失败,而且

代码语言:javascript
复制
        nextScene = scene2!

很管用。

代码语言:javascript
复制
//  ViewController.swift
import Cocoa
import SceneKit
import SpriteKit

class ViewController: NSViewController {

@IBOutlet weak var sceneView: SCNView!
private var sceneToggler:Bool = false
private var scene1: SCNScene? = SCNScene(named:"art.scnassets/scene1.scn")
private var scene2: SCNScene? = SCNScene(named:"art.scnassets/scene2.scn")

private func nextSceneToLoad() -> SCNScene {
    let nextScene: SCNScene

    if (sceneToggler) {
        //nextScene = SCNScene(named:"art.scnassets/scene1.scn")!
        nextScene = scene1!
        print ("scene1")
    }
    else {
        nextScene = SCNScene(named:"art.scnassets/scene2.scn")!
        //nextScene = scene2!
        print ("scene2")
    }
    print (nextScene)
    sceneToggler = !sceneToggler
    return nextScene
}

override func mouseUp(theEvent: NSEvent) {

    let skTransition:SKTransition = SKTransition.fadeWithDuration(5.0)
    skTransition.pausesIncomingScene = false
    skTransition.pausesOutgoingScene = false
    sceneView.presentScene(nextSceneToLoad(),
        withTransition:skTransition,
        incomingPointOfView:nil, completionHandler:nil)


    super.mouseUp(theEvent)
}
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34482115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档