如何在cocos2d-x中的两个场景之间切换?
How to alternate between two scenes in cocos2d-x?
我正在使用 Cocos2d-x 创建游戏。我目前正在创建一个游戏结束菜单,在该菜单中我需要能够切换到我的菜单场景和我的游戏场景(当我说切换到游戏场景时,我真的只是指 "to restart" 游戏)。但是循环依赖使我无法做到这一点。
MenuScene 需要能够使用 GameScene::create()
才能切换到游戏场景,游戏结束菜单需要能够同时使用 GameScene::create() or its restart funtion
和 MenuScene::create()
这给了我循环依赖问题
我无法将游戏结束菜单分离到它自己的文件中,因为我仍然需要 GameScene 依赖项,而 GameScene 需要游戏结束。
我不能将它们组合起来,因为 GameScene 需要依赖于 MenuScene
所以我的问题是:如何在 cocos2d-x c++ 中的两个场景之间切换。
我在某处读到过有关 Director 中的 push 和 popnig 场景的信息,但我不太了解它是如何工作的,或者我是否可以将其用于我的目的。
先感谢您!
编辑:
这么一想,是不是直接把mMenuScene推给Director再切换到GameScene就可以了?如果我正确理解 push/pop 机制,那应该可以工作。
我认为您可能误解了这有多复杂,使用我在下面提供的方法 可以而且应该 绝对可以将您的游戏场景拆分到它自己的文件中。
场景替换很简单,只需要使用下面的代码:
包括你的文件:
#include "MainGameScene.h"
在您的 onClickListener 中创建和切换场景:
auto gameOverScene = GameOverScene::createScene();
// use code below for hard replace
Director::getInstance()->replaceScene(gameOverScene );
// or use code below for transition fade replace
Director::getInstance()->replaceScene(TransitionFade::create(1, gameOverScene , Color3B(255, 255, 255)));
至于重启功能。我通常会为我的游戏结束场景提供一个回调,在单击重启按钮时调用该回调。并不是说我曾经将我的场景完全换成手机游戏场景,但无论如何我仍然以相同的方式进行。因此,让我们执行步骤(这假设您将游戏场景分离到它自己的名为 GameOverScene 的文件中 :))。
在您的 GameOverScene.h 中将函数指针存储到 MainGameScene 中的重置方法:
std::function<void()> _resetCallback;
在 运行 GameOverScene 之前,从主游戏场景设置函数指针。
auto gameOverScene = GameOverScene::createGameOverScene();
gameOverScene->setResetCallback(std::bind(&MainGameScene::reset, this));
单击重置按钮时,调用 _resetCallback
void GameOverScene::onResetClicked(Ref* sender)
{
_resetCallback();
}
这应该为您提供设置您想要的内容以及删除您拥有的循环依赖项所需的所有功能。我以前用过这种方法很多次,它总是有效。让我知道此解决方案是否适合您。
我正在使用 Cocos2d-x 创建游戏。我目前正在创建一个游戏结束菜单,在该菜单中我需要能够切换到我的菜单场景和我的游戏场景(当我说切换到游戏场景时,我真的只是指 "to restart" 游戏)。但是循环依赖使我无法做到这一点。
MenuScene 需要能够使用 GameScene::create()
才能切换到游戏场景,游戏结束菜单需要能够同时使用 GameScene::create() or its restart funtion
和 MenuScene::create()
这给了我循环依赖问题
我无法将游戏结束菜单分离到它自己的文件中,因为我仍然需要 GameScene 依赖项,而 GameScene 需要游戏结束。
我不能将它们组合起来,因为 GameScene 需要依赖于 MenuScene
所以我的问题是:如何在 cocos2d-x c++ 中的两个场景之间切换。
我在某处读到过有关 Director 中的 push 和 popnig 场景的信息,但我不太了解它是如何工作的,或者我是否可以将其用于我的目的。
先感谢您!
编辑:
这么一想,是不是直接把mMenuScene推给Director再切换到GameScene就可以了?如果我正确理解 push/pop 机制,那应该可以工作。
我认为您可能误解了这有多复杂,使用我在下面提供的方法 可以而且应该 绝对可以将您的游戏场景拆分到它自己的文件中。
场景替换很简单,只需要使用下面的代码:
包括你的文件:
#include "MainGameScene.h"
在您的 onClickListener 中创建和切换场景:
auto gameOverScene = GameOverScene::createScene();
// use code below for hard replace
Director::getInstance()->replaceScene(gameOverScene );
// or use code below for transition fade replace
Director::getInstance()->replaceScene(TransitionFade::create(1, gameOverScene , Color3B(255, 255, 255)));
至于重启功能。我通常会为我的游戏结束场景提供一个回调,在单击重启按钮时调用该回调。并不是说我曾经将我的场景完全换成手机游戏场景,但无论如何我仍然以相同的方式进行。因此,让我们执行步骤(这假设您将游戏场景分离到它自己的名为 GameOverScene 的文件中 :))。
在您的 GameOverScene.h 中将函数指针存储到 MainGameScene 中的重置方法:
std::function<void()> _resetCallback;
在 运行 GameOverScene 之前,从主游戏场景设置函数指针。
auto gameOverScene = GameOverScene::createGameOverScene(); gameOverScene->setResetCallback(std::bind(&MainGameScene::reset, this));
单击重置按钮时,调用 _resetCallback
void GameOverScene::onResetClicked(Ref* sender) { _resetCallback(); }
这应该为您提供设置您想要的内容以及删除您拥有的循环依赖项所需的所有功能。我以前用过这种方法很多次,它总是有效。让我知道此解决方案是否适合您。