在 Cocos2d 中改变场景主要有两个特性: pushScene
/popScene
和replaceScene
.
- 第一个是
pushScene
:
- (void) pushScene: (CCScene *) 场景
暂停正在运行的场景的执行,将其推送到暂停场景的堆栈上。将执行新场景。尽量避免大量推送场景以减少内存分配。仅在有正在运行的场景时才调用它。
此函数使用堆栈。它将所有场景存储在后进先出 (LIFO)数据结构中。基本上它会覆盖场景并以它们出现的相反顺序将它们移除。这可能是您想要“推动”(或调出)暂停菜单,并“弹出”(删除)暂停场景以恢复游戏的内容。
要返回一层,您只需调用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 Class
并replaceScene
从暂停菜单中退出并加载游戏播放场景。
5.replaceScene
使用退出暂停菜单并加载主屏幕。