如何从另一个场景中弹出特定的Cocos2D场景?

时间:2013-06-01 22:07:52

标签: iphone ios objective-c macos cocos2d-iphone

我开发了一款游戏,有三个场景:暂停菜单,主屏幕菜单和游戏本身。在游戏过程中,当游戏暂停时,它会显示暂停场景:

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

从暂停场景中,有三个选项:重启,恢复,主菜单。点击恢复时,它只会弹出暂停场景并返回游戏场景以恢复游戏。当点击主菜单时,它将游戏场景保持在背景中,并且从主菜单屏幕,游戏玩法仍然在运行。到目前为止,经过大量的研究,我还没有找到一种方法将popScene(几乎从RAM中踢出)从任何场景开始玩游戏场景,但游戏场景。从暂停屏幕,我可以使用:

[[CCDirector sharedDirector] popScene];

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

1 个答案:

答案 0 :(得分:6)

在Cocos2d中有两个主要功能可以更改场景:pushScene / popScenereplaceScene

  1. 第一个是pushScene
  2.   
        
    • (void)pushScene:(CCScene *)scene
    •   
         

    暂停正在运行的场景的执行,将其推入堆栈   暂停的场景。新场景将被执行。尽量避免大事   推送场景堆栈以减少内存分配。只要打电话给它   有一个正在运行的场景。

    此功能使用stack。它将所有场景存储在Last In-First Out (LIFO)数据结构中。基本上它覆盖了场景并按照它们来的相反顺序删除它们。这可能是你想要“推”(或调出)暂停菜单,然后“弹出”(删除)暂停场景,然后恢复游戏。

    要返回图层,只需拨打popScene

    即可
      
        
    • (void)popScene
    •   
         

    从队列中弹出一个场景。这个场景将取代跑步   一。正在运行的场景将被删除。如果没有更多场景   执行终止的堆栈。如果有的话,只打电话给它   跑步场景。

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

      
        
    • (void)replaceScene:(CCScene *)scene
    •   
         

    用新的场景替换正在运行的场景。运行场景是   终止。如果有正在运行的场景,则仅调用它

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

    **来源:cocos2D website

    编辑1:

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

    使用push / popScene:

    1.开始使用主屏幕运行。

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

    3.用户现在可以玩一下。然后他们想停下来休息一下。他们点击“暂停”按钮。然后使用pushScene保存Game Play场景的当前状态并开始运行Pause Menu场景。 (游戏玩法可以“暂停”)。   您的堆栈现在看起来像这样:

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

    [Game Play scene], [Pause Menu Scene]

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

    问题就变成了,如果你想从暂停开始怎么办?>主菜单。如果您刚刚在暂停菜单上使用replaceScene,那么旧游戏将留在内存中。您需要找到一种清除旧游戏场景的方法。

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

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

    使用替换场景:

    1.开始使用主屏幕运行。

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

    3.用户现在可以玩一下。然后他们想停下来休息一下。他们点击“暂停”按钮。立即“暂停”您的游戏并将所有必要的精灵,游戏逻辑等保存到Singleton Class,然后使用replaceScene退出游戏场景并加载暂停场景。然后根据他们的选择,您可以继续游戏(步骤4),或者转到主屏幕(步骤5)

    4.删除从Singleton ClassreplaceScene渲染游戏所需的一切,以便从暂停菜单退出并加载游戏场景。

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