【问题标题】:After replacing Scene, the Schedule method doesn't work anymore替换 Scene 后,Schedule 方法不再起作用
【发布时间】:2012-12-10 16:40:17
【问题描述】:

我正在 cocos2dx 中制作游戏,所以我创建了一个名为 CoCoGui 的类 我还为游戏的介绍页面创建了一个从CCLayerColor 继承的IntroPage 类和一个从CCLayerColor 继承的StartPage 类。 我想在前 2 秒显示介绍页面,然后显示 StartingPage 但是在CoCoGui(游戏的主循环)的updateGame函数中,当replaceScene方法被调用,Scene被替换时,updateGame方法将不再被调用! 请帮我解决这个问题 谢谢!

这是 CoCoGui.h 文件: StartingPageIntroPage 是继承自 CCLayerColor 的两个类

#ifndef _COCOGUI_H_
#define _COCOGUI_H_

#include "StartingPage.h"
#include "..\Classes\WorkSpace.h"
#include "..\Classes\GameBoard.h"
#include "..\Classes\IntroPage.h"
using namespace cocos2d;

class CoCoGui : public CCLayerColor{

public:
    CoCoGui();
    void addScene (CCScene * startPage, CCScene * work);
    virtual ~CoCoGui(void);
    void updateGame ( float dt );
    virtual bool init();
    static CCScene* scene();
    CREATE_FUNC(CoCoGui);
private:
    bool isInit;
    CCScene * runnigScene;
    IntroPage * introPage;
    StartingPage * startingPage;
    void onEnterTransitionDidFinish();
    void menuCloseCallback(CCObject* pSender);
public:
    CCScene * getRunningScene(void);
};

#endif /* COCOGUI_H */

这里还有 CoCoGui.cpp 文件

#include "CoCoGui.h"
#include <iostream>
using namespace std;
CCScene* CoCoGui::scene(){
    CCScene *scene = CCScene::create();
    CoCoGui *layer = CoCoGui::create();

    scene->addChild(layer);

    return scene;
}

CoCoGui::CoCoGui ( )
{
    this->isInit = false;
    this->introPage = new IntroPage ( );
    this->startingPage = new StartingPage ( );
}

CoCoGui::~CoCoGui(void)
{
    delete introPage;
    delete startingPage;
}

void CoCoGui::menuCloseCallback(CCObject* pSender)
{
    CCDirector::sharedDirector()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

bool CoCoGui::init ( ){
    if ( !CCLayerColor::initWithColor ( ccc4 (100,100,100,255) ) ){
        return false;
}
    this->schedule ( schedule_selector ( CoCoGui::updateGame ), 0.5 );
    return true;
}

void CoCoGui::updateGame ( float dt ){
    cout << "Update Called" << endl;
    if ( !isInit )
        return;
    CCScene * scene = NULL;
    if ( !this->introPage->isIntroPageDone ( ) ){
        scene = IntroPage::scene();
    }
    else if ( this->introPage->isIntroPageDone ( )  ){
        scene = StartingPage::scene();
}
    CCDirector::sharedDirector()->replaceScene(scene);
}

void CoCoGui::onEnterTransitionDidFinish ( ){
    isInit = true;
}


CCScene * CoCoGui::getRunningScene(void)
{
    return this->runnigScene;
}

【问题讨论】:

  • 在开始编程前先尝试了解cocos2d是如何通过CCDirector处理CCScene、CCLayer和node的。确保您知道何时开始一个场景,在您进入场景之前调用了哪些默认函数,以及在您离开该场景后调用了哪些函数。有 2 本书非常好: Cocos2d for iphone Game Development Cookbook / Learn cocos2d Game Development with iOS 5. cocos2d-x using the same way as cocos2d

标签: c++ cocos2d-iphone cocos2d-x


【解决方案1】:

ReplaceScene 将触发this-&gt;onExit(),这将触发unschedule 函数。

【讨论】:

    【解决方案2】:

    如果这类似于 cocos2d-iphone,您必须调用 onEnterTransitionDidFinish 的基类实现和类似的 onEnter/onExit 覆盖。在 cocos2d-iphone 中,其中一些方法不调用 super 会导致调度和输入停止工作。

    【讨论】:

    • 那么,你能给我举个例子吗?我是 cocos2dx 的初学者,我不知道如何处理。
    【解决方案3】:

    尝试添加

    this->resume();    
    

    在调用时间表之后。

    还要确保连接到图层的场景已加载。否则会导致运行时错误。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2012-11-03
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      相关资源
      最近更新 更多