Macos 重新打开spritekit场景
我的游戏中的场景: 主菜单->游戏设置菜单->核心游戏场景->游戏菜单(加载/保存/退出)->核心游戏场景->游戏菜单(此处停止工作) 每个片段都是它自己的场景,从一个片段呈现到另一个片段。游戏数据存储在可以从所有类访问的静态类中。 当我第一次开始游戏并进入核心游戏场景时,一切都很好。我可以打开游戏菜单并再次关闭它(返回核心游戏场景)。但当我想再次打开游戏菜单场景时,它不会启动didMoveToView功能,也不会发生任何事情。 我已经用相同的原理在场景之间进行了所有的转换,从主菜单场景到游戏设置和后台工作都很正常,我可以多次这样做。即使在没有过渡的情况下尝试过,但这里有些东西不太好用。。。似乎我在这里找不到解决方案:( AppDelegate非常超前:Macos 重新打开spritekit场景,macos,sprite-kit,skscene,Macos,Sprite Kit,Skscene,我的游戏中的场景: 主菜单->游戏设置菜单->核心游戏场景->游戏菜单(加载/保存/退出)->核心游戏场景->游戏菜单(此处停止工作) 每个片段都是它自己的场景,从一个片段呈现到另一个片段。游戏数据存储在可以从所有类访问的静态类中。 当我第一次开始游戏并进入核心游戏场景时,一切都很好。我可以打开游戏菜单并再次关闭它(返回核心游戏场景)。但当我想再次打开游戏菜单场景时,它不会启动didMoveToView功能,也不会发生任何事情。 我已经用相同的原理在场景之间进行了所有的转换,从主菜单场景到游戏设
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我不是很有钱。