Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 重新打开spritekit场景_Macos_Sprite Kit_Skscene - Fatal编程技术网

Macos 重新打开spritekit场景

Macos 重新打开spritekit场景,macos,sprite-kit,skscene,Macos,Sprite Kit,Skscene,我的游戏中的场景: 主菜单->游戏设置菜单->核心游戏场景->游戏菜单(加载/保存/退出)->核心游戏场景->游戏菜单(此处停止工作) 每个片段都是它自己的场景,从一个片段呈现到另一个片段。游戏数据存储在可以从所有类访问的静态类中。 当我第一次开始游戏并进入核心游戏场景时,一切都很好。我可以打开游戏菜单并再次关闭它(返回核心游戏场景)。但当我想再次打开游戏菜单场景时,它不会启动didMoveToView功能,也不会发生任何事情。 我已经用相同的原理在场景之间进行了所有的转换,从主菜单场景到游戏设

我的游戏中的场景:

主菜单->游戏设置菜单->核心游戏场景->游戏菜单(加载/保存/退出)->核心游戏场景->游戏菜单(此处停止工作)

每个片段都是它自己的场景,从一个片段呈现到另一个片段。游戏数据存储在可以从所有类访问的静态类中。 当我第一次开始游戏并进入核心游戏场景时,一切都很好。我可以打开游戏菜单并再次关闭它(返回核心游戏场景)。但当我想再次打开游戏菜单场景时,它不会启动didMoveToView功能,也不会发生任何事情。 我已经用相同的原理在场景之间进行了所有的转换,从主菜单场景到游戏设置和后台工作都很正常,我可以多次这样做。即使在没有过渡的情况下尝试过,但这里有些东西不太好用。。。似乎我在这里找不到解决方案:(

AppDelegate非常超前:

if let scene = MainMenu(fileNamed:"MainMenu")
{
    scene.size = CGSize(width: 1024, height: 768)
    scene.scaleMode = .AspectFit
    scene.backgroundColor = NSColor.blackColor()
    let transition = SKTransition.fadeWithDuration(1.5)
    self.skView!.presentScene(scene, transition: transition)
    self.skView!.ignoresSiblingOrder = true

    self.skView!.showsFPS = true
    self.skView!.showsNodeCount = true

    window.acceptsMouseMovedEvents = true
}
在主菜单类实例化QuickGame类/场景中,玩家设置游戏:

if let quickGameScene = QuickGame(fileNamed: "QuickGame")
{
    quickGameScene.scaleMode = self.scaleMode
    quickGameScene.backgroundColor = NSColor.blackColor()
    let transition = SKTransition.fadeWithDuration(1.5)
    view?.presentScene(quickGameScene, transition: transition)
}
在“处理”核心游戏逻辑的QuickGame实例CoreGame类中:

这里请注意GameData类,它本质上是一个类,持有可以从一个场景转移到另一个场景的静态属性。这里的想法是,当玩家进入主游戏菜单时,核心游戏场景会暂停,但不会被破坏,直到玩家开始新游戏或退出游戏。如果主游戏菜单关闭,核心游戏应该从先前的状态恢复!

以下是游戏数据:

class GameData
{ 
static var player = Player() 
static var background = SKSpriteNode() 
static var alreadyInitialized = false
static var mainGameMenuCreated = false
}
和CoreGame类中的MainGameMenu实例:

if let mainGameMenu = MainGameMenu(fileNamed: "MainGameMenu")
{
    mainGameMenu.scaleMode = self.scaleMode
    mainGameMenu.backgroundColor = NSColor.blackColor()
    let transition = SKTransition.fadeWithDuration(1.5)
    view?.presentScene(mainGameMenu, transition: transition)
}
和CoreGame类中的MainGameMenu实例:

if let mainGameMenu = MainGameMenu(fileNamed: "MainGameMenu")
{
    mainGameMenu.scaleMode = self.scaleMode
    mainGameMenu.backgroundColor = NSColor.blackColor()
    let transition = SKTransition.fadeWithDuration(1.5)
    view?.presentScene(mainGameMenu, transition: transition)
}
并将CoreGAme实例化回主游戏菜单:

if let coreGame = CoreGame(fileNamed: "CoreGame") 
{ 
    coreGame.scaleMode = self.scaleMode 
    coreGame.backgroundColor = NSColor.blackColor() 
    let transition = SKTransition.fadeWithDuration(1.5)
    view?.presentScene(coreGame, transition: transition) 
}

还需要什么吗?抱歉,代码太乱了,但在这里编辑代码太伤脑筋了…

你能分享一些可以复制问题的代码吗?Yikes,你确定你的旧场景被删除了吗?还有,它看起来像视图?这不是你想要的行为,当你呈现场景时,你想确保视图不是零,所以也许有一个断言,如果您的视图为零,它将触发,这可能有助于跟踪您的问题如何检查旧场景是否已删除,以及如果需要,如何保留一个场景以备将来使用?覆盖deinit并打印(“类deinit”),至于你的第二个,只要有一个变量保留它,但我不会这样做,这样你就会耗尽资源。好的,我们在这里有一些东西。我在所有场景类中放入Denit部分,除了MainGameMenu之外,没有一个被调用,除了我第一次尝试打开它之外,每次都调用它。因此,似乎场景没有被释放,但问题仍然存在关于为什么我可以在主菜单和QuickGame场景之间来回切换,而不是CoreGame和MainGameMenu。唯一的区别是我已经初始化了游戏数据,但这个类包含可以从任何地方访问的静态属性…是否可以重用旧场景而不是始终创建新场景?文档是n我不是很有钱。