2

我有一个自己开发的游戏,有三个场景:暂停菜单、主屏幕菜单和游戏本身。在游戏过程中,当游戏暂停时,它会调出暂停场景:

[[CCDirector sharedDirector] pushScene:[PauseScene node]];

从暂停场景来看,共有三个选项:重启、恢复、主菜单。单击恢复时,它只会弹出暂停场景并返回游戏场景以恢复游戏。单击主菜单时,它会将游戏场景保留在后台,并且从主菜单屏幕中,游戏仍在运行。到目前为止,经过大量研究,我还没有找到一种方法来从除游戏场景之外的任何场景中弹出场景(几乎将其从 RAM 中踢出)游戏场景。在暂停屏幕上,我可以使用:

[[CCDirector sharedDirector] popScene];

摆脱暂停场景,如果我从游戏场景上的方法运行该代码,我可以摆脱该游戏实例,但我需要一种方法来弹出在后台运行的游戏节点暂停节点。总的来说,基本问题是:如何从另一个场景中弹出 Cocos2d 中的特定场景?

4

1 回答 1

6

在 Cocos2d 中改变场景主要有两个特性: pushScene/popScenereplaceScene.

  1. 第一个是pushScene
  • (void) pushScene: (CCScene *) 场景

暂停正在运行的场景的执行,将其推送到暂停场景的堆栈上。将执行新场景。尽量避免大量推送场景以减少内存分配。仅在有正在运行的场景时才调用它。

此函数使用堆栈。它将所有场景存储在后进先出 (LIFO)数据结构中。基本上它会覆盖场景并以它们出现的相反顺序将它们移除。这可能是您想要“推动”(或调出)暂停菜单,并“弹出”(删除)暂停场景以恢复游戏的内容。

要返回一层,您只需调用popScene

  • (无效)popScene

从队列中弹出一个场景。这个场景将取代正在运行的场景。正在运行的场景将被删除。如果堆栈中没有更多场景,则终止执行。仅在有正在运行的场景时才调用它。

2.我相信您会想要的另一个选项是replaceScene. 这将停止当前正在运行的场景并用一个全新的场景替换它。这可能是您第一次结束游戏或从原始主菜单过渡到游戏玩法时想要的:

  • (void) replaceScene: (CCScene *) 场景

用新的场景替换正在运行的场景。正在运行的场景终止。仅在有正在运行的场景时才调用它

*请记住:pushScene谨慎使用。它将所有场景存储在内存中,以便以后可以将它们从堆栈中弹出。所以不要存储太多场景而忘记它们。

**来源:cocos2D 网站

编辑1:

你有几个选择。请记住,它replaceScene只会替换当前正在运行的场景,并且通常是您想要使用的。它不会“清除”整个场景堆栈,因此您通常很少想使用pushScene/ popScene。在下面的演示中,我向您展示了两者的问题。但是,我确实会尽可能地节省内存。

使用推送/流行场景:

1.从主屏幕开始运行。

2.当用户点击“播放”按钮时,使用replaceScene停止主屏幕场景并开始运行游戏播放场景(请记住,主屏幕将不再运行或保存在内存中的任何位置。如果它必须记住任何信息,然后使用 将其保存到堆栈中pushScene。我这样做的原因是因为主屏幕可能每次都相同,并且在我们玩游戏时不需要继续运行)。

3.用户现在可以玩一会儿了。然后他们想停下来上个厕所。他们单击“暂停”按钮。然后使用pushScene保存 Game Play 场景的当前状态并开始运行 Pause Menu 场景。(可以说游戏是“暂停”的)。您的堆栈现在如下所示:

//Bottom ----------------------> Top

[Game Play scene], [Pause Menu Scene]

4.暂停片刻后,他们可以使用pushScene从内存中删除暂停菜单场景,并加载“暂停”的游戏播放场景并立即恢复播放。

那么问题就变成了,好吧,如果你想从暂停 - > 主菜单中去怎么办。如果您只是replaceScene在暂停菜单上使用,那么旧游戏将在记忆中挥之不去。您需要找到一种方法来清除旧的 Game Play 场景。

另一个选项必须是通过将主屏幕保持在堆栈中pushScene,然后弹出两次来保持主屏幕。根据我的经验,这通常会导致“跳跃”的过渡。

首选的方法往往是:创建一个单例类并在您暂停时保存内存。(单例类只是一个只有一个实例的类。它基本上是我们的“当前游戏状态”数据。我推荐这个教程。)

使用替换场景:

1.从主屏幕开始运行。

2.当用户点击“播放”按钮时,使用replaceScene停止主屏幕场景并开始运行游戏播放场景(请记住,主屏幕将不再运行或保存在内存中的任何位置。如果它必须记住任何信息,然后有一部分Singleton Class用于主屏幕数据)。

3.用户现在可以玩一会儿了。然后他们想停下来上个厕所。他们单击“暂停”按钮。立即“暂停”您的游戏并将所有必要的精灵、游戏逻辑等保存到Singleton Class,然后用于replaceScene退出 Game Play 场景并加载暂停场景。然后根据他们的选择,您要么继续游戏(步骤 4),要么进入主屏幕(步骤 5)

4.从暂停菜单中重新加载渲染游戏所需的一切,Singleton ClassreplaceScene从暂停菜单中退出并加载游戏播放场景。

5.replaceScene使用退出暂停菜单并加载主屏幕。

于 2013-06-01T22:20:27.997 回答