2015-10-18 3 views
1


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

Так что мой вопрос: Как я могу переключаться между двумя сценами в cocos2d-х C++.

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

EDIT:
Теперь, когда я думаю об этом, могу ли я не просто нажать mMenuScene на директора, прежде чем переключиться на GameScene? Это должно сработать, если я правильно понимаю, что механик толчок/поп.

ответ

2

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

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

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

#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(); 
    } 
    

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

+0

Как это будет работать, если я хочу иметь возможность переключаться между Menu- и Game-scene? Вы имеете в виду, что я объединяю их в одну сцену/слой? (Теперь, когда я думаю об этом, это может быть не такая уж плохая идея). В противном случае у меня есть другой подход, который использует указатели функций, которые вы так любезно напомнили мне, существовали :) – Tritzium

+0

По-моему, файлы сцены всегда должны быть отдельными файлами , Это было бы точно так же. Меню должно содержать файл заголовка к вам GameScene.h, поэтому и вы будете использовать тот же самый код, который я изложил выше, чтобы поменять место между сценой. Я не понимаю, почему это было бы иначе, чем Game-> GameOver. Если они все разделены, вы можете просто перейти к любой из них. Вы НЕ должны комбинировать свою сцену в одну. Это очень плохая идея в общем дизайне и общем развитии игры. Это затруднит обслуживание и исправления ошибок. –

Смежные вопросы