cocos2d-x 自定义的场景转换
来源:互联网 发布:c sql语句换行 编辑:程序博客网 时间:2024/05/24 15:38
虽然coco2d-x里提供了很多强大的场景转换类 ,但有时候自己需要的一些效果cocos2d-x还是无法解决,毕竟越是方便的东西越有它的局限性,所以我就自己定义了一个场景转换类:
因为自定义的场景转换类 需要继承 CCTransitionScene场景转换基类,于是我还是把场景转换类的代码 全部看了一遍,以防在某些环节使用不当而导致未知的错误,所以我先来说明CCTransitionScene 的内部构造和实现方式。
首先,我们来看看 CCTransitionScene的定义
class CC_DLL CCTransitionScene : public CCScene{protected:
//载入场景 CCScene * m_pInScene;
//载出场景 CCScene * m_pOutScene;
//动画播放时间 float m_fDuration;
//顾名思义 就是载入场景是否置顶 bool m_bIsInSceneOnTop;
//载出场景是否需要被清理,在clearnup()中被调用 bool m_bIsSendCleanupToScene;public: CCTransitionScene(); virtual ~CCTransitionScene();
//决定场景 层的先后顺序 virtual void draw();
virtual void onEnter(); virtual void onExit();
//清理载出场景 virtual void cleanup(); /** creates a base transition with duration and incoming scene @deprecated: This interface will be deprecated sooner or later. */
//CC_DEPRECATED_ATTRIBUTE 表示 不建议使用的,分配空间函数 CC_DEPRECATED_ATTRIBUTE static CCTransitionScene * transitionWithDuration(float t, CCScene *scene); /** creates a base transition with duration and incoming scene */
//同上,现在cocos2d-x把地址分配函数都 统一成create ,这点做的很好 static CCTransitionScene * create(float t, CCScene *scene); /** initializes a transition with duration and incoming scene */
//初始化函数,一般不需要自己调用 virtual bool initWithDuration(float t,CCScene* scene); /** called after the transition finishes */
//销毁函数,当新场景载入完成时隐式销毁旧场景 void finish(void); /** used by some transitions to hide the outer scene */
//隐藏旧场景 显示新场景 void hideOutShowIn(void);protected:
//把载入场景置顶 virtual void sceneOrder();private: void setNewScene(float dt);};
看看各个函数的定义
CCTransitionScene * CCTransitionScene::create(float t, CCScene *scene){
CCTransitionScene * pScene = new CCTransitionScene();//分配地址 if(pScene && pScene->initWithDuration(t,scene))//初始化 {
//用smart point pScene->autorelease(); return pScene; }
//安全释放,既if(pScene)delete pScene = 0 CC_SAFE_DELETE(pScene); return NULL;}transitionWithDuration 函数也是调用create
bool CCTransitionScene::initWithDuration(float t, CCScene *scene){ CCAssert( scene != NULL, "Argument scene must be non-nil"); if (CCScene::init()) { m_fDuration = t; // retain m_pInScene = scene;
m_pInScene->retain();
//保证2个场景同时存在m_pOutScene = CCDirector::sharedDirector()->getRunningScene(); if (m_pOutScene == NULL) { m_pOutScene = CCScene::create(); m_pOutScene->init(); } m_pOutScene->retain(); //防止 旧场景 和新场景是 同一场景 CCAssert( m_pInScene != m_pOutScene, "Incoming scene must be different from the outgoing scene" ); // disable events while transitionsCCDirector* pDirector = CCDirector::sharedDirector();//停止 所有touch 事件pDirector->getTouchDispatcher()->setDispatchEvents(false);让新场景置顶 this->sceneOrder(); return true; } else { return false; }}void CCTransitionScene::sceneOrder(){ m_bIsInSceneOnTop = true;}void CCTransitionScene::draw(){ CCScene::draw(); //画场景的先后顺序 if( m_bIsInSceneOnTop ) { m_pOutScene->visit(); m_pInScene->visit(); } else { m_pInScene->visit(); m_pOutScene->visit(); }}void CCTransitionScene::finish(){ // clean up//场景转换完成,还原所有场景 然后delete 掉旧场景 replace 到新场景 m_pInScene->setVisible(true); m_pInScene->setPosition(ccp(0,0)); m_pInScene->setScale(1.0f); m_pInScene->setRotation(0.0f); m_pInScene->getCamera()->restore(); m_pOutScene->setVisible(false); m_pOutScene->setPosition(ccp(0,0)); m_pOutScene->setScale(1.0f); m_pOutScene->setRotation(0.0f); m_pOutScene->getCamera()->restore(); //[self schedule:@selector(setNewScene:) interval:0];this->schedule(schedule_selector(CCTransitionScene::setNewScene), 0);}void CCTransitionScene::setNewScene(float dt){ CC_UNUSED_PARAM(dt); // [self unschedule:_cmd]; // "_cmd" is a local variable automatically defined in a method // that contains the selector for the method this->unschedule(schedule_selector(CCTransitionScene::setNewScene)); CCDirector *director = CCDirector::sharedDirector(); // Before replacing, save the "send cleanup to scene" m_bIsSendCleanupToScene = director->isSendCleanupToScene(); director->replaceScene(m_pInScene); // enable events while transitions(恢复touch事件) director->getTouchDispatcher()->setDispatchEvents(true); // issue #267 m_pOutScene->setVisible(true);}void CCTransitionScene::hideOutShowIn(){ m_pInScene->setVisible(true); m_pOutScene->setVisible(false);}// custom onEntervoid CCTransitionScene::onEnter(){ CCScene::onEnter(); m_pInScene->onEnter(); // outScene should not receive the onEnter callback}// custom onExitvoid CCTransitionScene::onExit(){ CCScene::onExit(); m_pOutScene->onExit(); // inScene should not receive the onExit callback // only the onEnterTransitionDidFinish m_pInScene->onEnterTransitionDidFinish();}// custom cleanupvoid CCTransitionScene::cleanup(){ CCScene::cleanup(); if( m_bIsSendCleanupToScene ) m_pOutScene->cleanup();}还有cocos2d 2.0 的新派生类CCTransitionScene,但今天就写怎么多,下次继续写
- cocos2d-x 自定义的场景转换
- cocos2d-x 自定义一个场景
- cocos2d-x 自定义场景和场景跳转
- cocos2d-x 自定义场景和场景跳转
- cocos2d-x的场景
- cocos2d-x 一个自定义场景切换的实例
- cocos2D-x:场景转换效果(6)
- cocos2d-x创建和转换场景
- cocos2d-x 场景的切换
- cocos2d-x 场景的切换
- Cocos2d-x 场景的生命周期
- [Cocos2d-x v3.x官方文档]场景转换(Transitions)
- Cocos2d-x v3.x官方文档]场景转换(Transitions)
- cocos2d-x的场景的属性
- Cocos2d-x场景的层次的结构设计
- 我的Cocos2d-x学习笔记(四)场景转换特效
- cocos2d-x 屏蔽场景的Touch事件
- cocos2d-x 场景里面常见的函数
- 看看老外是如何理解抽象类的
- 就业招聘网站收集:
- 基于 Android NDK 的学习之旅-----资源释放
- 倒填矩阵
- C++ 中list容器,自定义sort排序规则,stl中sort自定义排序规则
- cocos2d-x 自定义的场景转换
- 我的编程回顾 —— 浅谈怎么快速学习一门新的编程语言
- C/C++的64位整型
- 我们在囧途之软件投标篇
- sgi stl中list的sort函数实现
- Win7+VMware Workstation环境下的CentOS-Linux网络连接设置
- 如何实现指定frame的单独前进、后退?
- 开发工具列表
- Linux 开启VNCSERVER