Я создаю игру, используя Cocos2d-x. В настоящее время я создаю игровое меню, в этом меню мне нужно иметь возможность переключаться как на мою менструальную сцену, так и на мою игровую сцену (когда я говорю о переключении на игровую сцену, я на самом деле имею в виду только «перезапустить» игру). Но циклические зависимости мешают мне сделать это.
MenuScene должен быть в состоянии использоватьGameScene::create()
для того, чтобы переключиться на игровую сцену и меню Gameover должно быть в состоянии использовать оба GameScene::create() or its restart funtion
а также MenuScene::create()
что дает мне проблемы с круговой зависимостью
Я не могу разделить меню Gameover на собственный файл, так как мне все еще нужна зависимость GameScene, а GameScene потребуется Gameover.
Я не могу объединить их, так как GameScene тогда зависит от MenuScene
Итак, мой вопрос: как мне чередовать две сцены в cocos2d-x c ++.
Я где-то читал о продвижении и всплывающих сценах в Director, но я не очень понимаю, как это работает, и могу ли я использовать это для своих целей.
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Теперь, когда я думаю об этом, могу ли я просто передать mMenuScene Директору, прежде чем перейти к 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();
}
Это должно предоставить вам все функциональные возможности, необходимые для настройки того, что вы хотите, а также удалить круговую зависимость, которая у вас есть. Я использовал этот способ много раз, и он всегда работает. Дайте мне знать, если это решение работает для вас.
Других решений пока нет …