Как переключаться между двумя сценами в cocos2d-x?


Я создаю игру с помощью Cocos2d-x. В настоящее время я создаю меню прохождения игры, в этом меню мне нужно иметь возможность переключаться как на мою сцену меню, так и на мою игровую сцену (когда я говорю «переключиться на игровую сцену», я имею в виду только «перезапустить» игру). Но циклические зависимости мешают мне сделать это.
MenuScene должна иметь возможность использоватьGameScene::create(), чтобы переключиться на игровую сцену, а меню прохождения игры должно иметь возможность использовать как GameScene::create() or its restart funtion, так и MenuScene::create(), что дает мне циклическую зависимость. проблемы
Я не могу выделить свое меню GameOver в отдельный файл, так как мне по-прежнему нужна зависимость от GameScene, а GameScene потребуется GameOver.
Я не могу их объединить, так как GameScene должна зависеть от MenuScene

Итак, мой вопрос: как мне переключаться между двумя сценами в cocos2d-x c++.

Я где-то читал о толчках и всплывающих сценах в Director, но я не совсем понимаю, как это работает и могу ли я использовать это для своих целей.
Заранее спасибо!

РЕДАКТИРОВАТЬ:
Теперь, когда я думаю об этом, могу ли я просто нажать mMenuScene на Director, прежде чем переключиться на GameScene? Это должно работать, если я правильно понимаю эту механику push/pop.


person v_johan    schedule 18.10.2015    source источник


Ответы (1)


Я думаю, у вас может быть неправильное представление о том, насколько это сложно, используя способ, который я предоставил ниже, вы можете и должны определенно разделить свою игру по сценам в отдельный файл.

Замена сцены достаточно проста, просто используйте код ниже:

Включая ваш файл:

#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 :)).

  1. Сохраните указатель функции в вашем GameOverScene.h на ваш метод сброса в MainGameScene:

    std::function<void()> _resetCallback;
    
  2. Установите указатель функции из основной игровой сцены перед запуском с помощью GameOverScene.

    auto gameOverScene = GameOverScene::createGameOverScene();
    gameOverScene->setResetCallback(std::bind(&MainGameScene::reset, this));
    
  3. Когда ваша кнопка сброса нажата, вызовите _resetCallback

    void GameOverScene::onResetClicked(Ref* sender)
    {
      _resetCallback();
    }
    

Это должно предоставить вам все функции, необходимые для настройки того, что вы хотите, а также удалить круговую зависимость, которая у вас есть. Я использовал этот способ много раз раньше, и он всегда работает. Дайте мне знать, если это решение работает для вас.

person Filled Stacks    schedule 19.10.2015
comment
Как это будет работать, если я хочу иметь возможность переключаться между меню и игрой? Вы имеете в виду, что я объединяю их в одну сцену/слой? (Теперь, когда я думаю об этом, это может быть не такой уж плохой идеей). В противном случае у меня есть другой способ, использующий указатели на функции, о существовании которых вы так любезно напомнили :) - person v_johan; 20.10.2015
comment
На мой взгляд, файлы сцен всегда должны быть отдельными файлами. Было бы точно так же. Меню должно включать в себя заголовочный файл GameScene.h, поэтому вы будете использовать тот же самый код, который я изложил выше, для переключения между сценами. Не понимаю, чем это отличается от Game->GameOver. Если они все отдельные, вы можете просто перейти к любому из любого другого. Вы НЕ должны объединять свои сцены в одну. Это очень плохая идея для общего дизайна и разработки игры. Это сильно усложнит техническое обслуживание и исправление ошибок. - person Filled Stacks; 20.10.2015