cocos2dx 3.x 场景切换特效整合——实现一个场景工厂管理类

前端之家收集整理的这篇文章主要介绍了cocos2dx 3.x 场景切换特效整合——实现一个场景工厂管理类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

用了coco2dx引擎也有段时间了,但是总感觉不是很好用,为了写一个功能,往往要写好几行代码,就比如做一个场景切换特效,就要这么写

  1. auto scene=HelloWorld::create();//创建待切换的场景
  2. auto transition=TransitionFade::create(1.0f,scene);//给场景增加特效
  3. Director::getInstance()->replaceScene(transition);//运用导演类来进行切换场景

简单的一个功能,却要写三行代码,而且很多地方需要用到场景切换,每次使用就要至少写三行,还要做添加不同场景对应头文件之类的事,真的好麻烦。
作为一个讲究效率(其实是嫌麻烦)的程序员,肯定想尽可能的避免这类麻烦的事发生。如果能进一步封装一下这三行代码,直接一个函数就实现场景切换特效该多好,于是乎,一个场景工厂管理类就诞生了,这可以大大的提高我的开发效率(你说这人怎么这么懒呢)。
不多说了,上代码
首先是SceneFactory.h

  1. #ifndef __SceneFactory_h__
  2. #define __SceneFactory_h__
  3. #include "cocos2d.h"
  4. //scene headers
  5. #include "GameScene.h"
  6. #include "LoginScene.h"
  7. #include "IntroScene.h"
  8.  
  9.  
  10.  
  11. USING_NS_CC;
  12. //场景类型,根据自己的项目场景修改添加
  13. enum kSceneType
  14. {
  15. kSceneGame = 1,kSceneChallenge,kSceneIntro,kSceneLogin
  16. };
  17.  
  18. //场景切换效果类型
  19. enum kTranslateType
  20. {
  21. kNone,//没有任何效果
  22. kCrossFade,//淡出当前场景的同时淡入下一个场景
  23. kFade,//淡出当前场景到指定颜色,默认颜色为c3b(0,0),可用最后一个参数指定颜色
  24. kFadeBL,//从左下角开始淡出场景
  25. kFadeDown,//从底部开始淡出场景
  26. kFadeTR,//从右上角开始淡出场景
  27. kFadeUp,//从顶部开始淡出场景
  28. kFlipAngularLeftOver,//当前场景倾斜后翻转成下一个场景,默认从左边开始翻转
  29. kFlipAngularRightOver,//当前场景倾斜后翻转成下一个场景,默认从左边开始翻转
  30. //LeftOver,//从左边开始
  31. //RightOver,//从右边开始
  32. //UpOver,//从顶部开始
  33. //DownOver,//从底部开始
  34. //kFlipX,//水平翻转,默认从左往右翻转,可用的附加参数同上
  35. kFlipXLeftOver,kFlipXRightOver,kFlipXUpOver,kFlipXDownOver,//kFlipY,//垂直翻转,默认从上往下翻转,可用的附加参数同上
  36. kFlipYLeftOver,kFlipYRightOver,kFlipYUpOver,kFlipYDownOver,kZoomFlipAngularLeftOver,//倾斜翻转的同时放大,可用的附加参数同上
  37. kZoomFlipAngularRightOver,//倾斜翻转的同时放大,可用的附加参数同上
  38. //kZoomFlipX,//水平翻转的同时放大,可用的附加参数同上
  39. kZoomFlipXLeftOver,kZoomFlipXRightOver,kZoomFlipXUpOver,kZoomFlipXDownOver,//kZoomFlipY,//垂直翻转的同时放大,可用的附加参数同上
  40. kZoomFlipYLeftOver,kZoomFlipYRightOver,kZoomFlipYUpOver,kZoomFlipYDownOver,kJumpZoom,//跳跃放大切换场景
  41. kMoveInB,//新场景从底部进入,直接覆盖现有场景
  42. kMoveInL,//新场景从左侧进入,直接覆盖现有场景
  43. kMoveInR,//新场景从右侧进入,直接覆盖现有场景
  44. kMoveInT,//新场景从顶部进入,直接覆盖现有场景
  45. kPageTurnTure,//翻页效果,如果指定附加参数为,//true,则表示从左侧往右翻页
  46. kPageTurnFalse,//true,则表示从左侧往右翻页
  47. kRotoZoom,//旋转放大切换场景
  48. kShrinkGrow,//收缩交叉切换场景
  49. kSlideInB,//新场景从底部进入,现有场景同时从顶部退出
  50. kSlideInL,//新场景从左侧进入,现有场景同时从右侧退出
  51. kSlideInR,//新场景从右侧进入,现有场景同时从左侧退出
  52. kSlideInT,//新场景从顶部进入,现有场景同时从底部退出
  53. kSplitCols,//分成多列切换入新场景
  54. kSplitRows,//分成多行切换入新场景,类似百叶窗
  55. kTurnOffTiles//当前场景分成多个块,逐渐替换为新场景
  56. };
  57.  
  58. class SceneFactory {
  59. public:
  60. SceneFactory();
  61. ~SceneFactory();
  62.  
  63. //新建一个场景
  64. static Scene* create(kSceneType type);
  65. //新建一个带参数的场景
  66. static Scene* create(kSceneType type,int level);
  67. //场景切换(场景类型,场景切换类型,切换所需时间)
  68. static void changeScene(kSceneType type,kTranslateType transType,float t);
  69. //场景切换(场景类型,带自定义参数的场景,场景切换类型,切换所需时间)
  70. static void changeScene(kSceneType type,int level,float t);
  71.  
  72. static TransitionScene* createTransition(kTranslateType transType,Scene* s,float t);
  73. private:
  74.  
  75. };
  76.  
  77. #endif // SceneFactory_h__

然后是其对应的SceneFactory.cpp

  1. #include "SceneFactory.h"
  2. Scene* SceneFactory::create(kSceneType type)
  3. {
  4. Scene* scene = nullptr;
  5. //该工厂根据场景的类型创造出相对应的场景
  6. switch (type)
  7. {
  8. case kSceneGame:
  9. scene = GameScene::create();
  10. break;
  11. case kSceneChallenge:
  12. break;
  13. case kSceneIntro:
  14. scene = IntroScene::create();
  15. break;
  16. case kSceneLogin:
  17. scene = LoginScene::create();
  18. break;
  19. default:
  20. break;
  21. }
  22. return scene;
  23. }
  24.  
  25. Scene* SceneFactory::create(kSceneType type,int level)
  26. {
  27. Scene* scene = nullptr;
  28. switch (type)
  29. {
  30. case kSceneGame:
  31. scene = GameScene::create(level);
  32. break;
  33. default:
  34. break;
  35. }
  36. return scene;
  37. }
  38.  
  39. TransitionScene* SceneFactory::createTransition(kTranslateType transType,float t)
  40. {
  41. TransitionScene* scene = nullptr;
  42. //根据场景的转换类型,生产出不同的带特效的转换场景
  43. //这些场景转换特效我是从cpp-test里的场景转换的例子里抄过来的,如果有缺少,请按照格式自行添加
  44. switch (transType)
  45. {
  46. case kNone:
  47. scene = TransitionScene::create(t,s);
  48. break;
  49. case kCrossFade:
  50. scene = TransitionCrossFade::create(t,s);
  51. break;
  52. case kFade:
  53. scene = TransitionFade::create(t,s);
  54. break;
  55. case kFadeBL:
  56. scene = TransitionFadeBL::create(t,s);
  57. break;
  58. case kFadeDown:
  59. scene = TransitionFadeDown::create(t,s);
  60. break;
  61. case kFadeTR:
  62. scene = TransitionFadeTR::create(t,s);
  63. break;
  64. case kFadeUp:
  65. scene = TransitionFadeUp::create(t,s);
  66. break;
  67. case kFlipAngularLeftOver:
  68. scene = TransitionFlipAngular::create(t,s,TransitionScene::Orientation::LEFT_OVER);
  69. break;
  70. case kFlipAngularRightOver:
  71. scene = TransitionFlipAngular::create(t,TransitionScene::Orientation::RIGHT_OVER);
  72. break;
  73. case kFlipXLeftOver:
  74. scene = TransitionFlipX::create(t,TransitionScene::Orientation::LEFT_OVER);
  75. break;
  76. case kFlipXRightOver:
  77. scene = TransitionFlipX::create(t,TransitionScene::Orientation::RIGHT_OVER);
  78. break;
  79. case kFlipXUpOver:
  80. scene = TransitionFlipX::create(t,TransitionScene::Orientation::UP_OVER);
  81. break;
  82. case kFlipXDownOver:
  83. scene = TransitionFlipX::create(t,TransitionScene::Orientation::DOWN_OVER);
  84. break;
  85. case kFlipYLeftOver:
  86. scene = TransitionFlipY::create(t,TransitionScene::Orientation::LEFT_OVER);
  87. break;
  88. case kFlipYRightOver:
  89. scene = TransitionFlipY::create(t,TransitionScene::Orientation::RIGHT_OVER);
  90. break;
  91. case kFlipYUpOver:
  92. scene = TransitionFlipY::create(t,TransitionScene::Orientation::UP_OVER);
  93. break;
  94. case kFlipYDownOver:
  95. scene = TransitionFlipY::create(t,TransitionScene::Orientation::DOWN_OVER);
  96. break;
  97. case kZoomFlipAngularLeftOver:
  98. scene = TransitionZoomFlipAngular::create(t,TransitionScene::Orientation::LEFT_OVER);
  99. break;
  100. case kZoomFlipAngularRightOver:
  101. scene = TransitionZoomFlipAngular::create(t,TransitionScene::Orientation::RIGHT_OVER);
  102. break;
  103. case kZoomFlipXLeftOver:
  104. scene = TransitionZoomFlipX::create(t,TransitionScene::Orientation::LEFT_OVER);
  105. break;
  106. case kZoomFlipXRightOver:
  107. scene = TransitionZoomFlipX::create(t,TransitionScene::Orientation::RIGHT_OVER);
  108. break;
  109. case kZoomFlipXUpOver:
  110. scene = TransitionZoomFlipX::create(t,TransitionScene::Orientation::UP_OVER);
  111. break;
  112. case kZoomFlipXDownOver:
  113. scene = TransitionZoomFlipX::create(t,TransitionScene::Orientation::DOWN_OVER);
  114. break;
  115. case kZoomFlipYLeftOver:
  116. scene = TransitionZoomFlipY::create(t,TransitionScene::Orientation::LEFT_OVER);
  117. break;
  118. case kZoomFlipYRightOver:
  119. scene = TransitionZoomFlipY::create(t,TransitionScene::Orientation::RIGHT_OVER);
  120. break;
  121. case kZoomFlipYUpOver:
  122. scene = TransitionZoomFlipY::create(t,TransitionScene::Orientation::UP_OVER);
  123. break;
  124. case kZoomFlipYDownOver:
  125. scene = TransitionZoomFlipY::create(t,TransitionScene::Orientation::DOWN_OVER);
  126. break;
  127. case kJumpZoom:
  128. scene = TransitionJumpZoom::create(t,s);
  129. break;
  130. case kMoveInB:
  131. scene = TransitionMoveInB::create(t,s);
  132. break;
  133. case kMoveInL:
  134. scene = TransitionMoveInL::create(t,s);
  135. break;
  136. case kMoveInR:
  137. scene = TransitionMoveInR::create(t,s);
  138. break;
  139. case kMoveInT:
  140. scene = TransitionMoveInT::create(t,s);
  141. break;
  142. case kPageTurnTure:
  143. scene = TransitionPageTurn::create(t,true);
  144. break;
  145. case kPageTurnFalse:
  146. scene = TransitionPageTurn::create(t,false);
  147. break;
  148. case kRotoZoom:
  149. scene = TransitionRotoZoom::create(t,s);
  150. break;
  151. case kShrinkGrow:
  152. scene = TransitionShrinkGrow::create(t,s);
  153. break;
  154. case kSlideInB:
  155. scene = TransitionSlideInB::create(t,s);
  156. break;
  157. case kSlideInL:
  158. scene = TransitionSlideInL::create(t,s);
  159. break;
  160. case kSlideInR:
  161. scene = TransitionSlideInR::create(t,s);
  162. break;
  163. case kSlideInT:
  164. scene = TransitionSlideInT::create(t,s);
  165. break;
  166. case kSplitCols:
  167. scene = TransitionSplitCols::create(t,s);
  168. break;
  169. case kSplitRows:
  170. scene = TransitionSplitRows::create(t,s);
  171. break;
  172. case kTurnOffTiles:
  173. scene = TransitionTurnOffTiles::create(t,s);
  174. break;
  175. default:
  176. break;
  177. }
  178. return scene;
  179. }
  180.  
  181. void SceneFactory::changeScene(kSceneType type,float t)
  182. {
  183. auto scene = SceneFactory::create(type);
  184. auto transcene = SceneFactory::createTransition(transType,scene,t);
  185.  
  186. //若当前有正在运行的场景,切换成该新场景,否则运行该新场景
  187. if (Director::getInstance()->getRunningScene()) { if (transType == kNone) { Director::getInstance()->replaceScene(scene);
  188. }
  189. else
  190. {
  191. Director::getInstance()->replaceScene(transcene);
  192. }
  193.  
  194. }
  195. else
  196. {
  197. Director::getInstance()->runWithScene(scene);
  198. }
  199. }
  200.  
  201. void SceneFactory::changeScene(kSceneType type,int level,float t)
  202. {
  203. auto scene = SceneFactory::create(type,level);
  204. auto transcene = SceneFactory::createTransition(transType,t);
  205. if (Director::getInstance()->getRunningScene()) { Director::getInstance()->replaceScene(transcene);
  206. }
  207. else
  208. {
  209. Director::getInstance()->runWithScene(scene);
  210. }
  211. }
  212.  
  213.  
  214.  
  215. SceneFactory::SceneFactory()
  216. {
  217. }
  218.  
  219. SceneFactory::~SceneFactory()
  220. {
  221. }

好啦,以上就是所有代码(好多好多场景切换特效,写的有点累,不过为了以后能偷懒,我忍),那怎么使用呢?很简单。

  1. SceneFactory::changeScene(kTypeGame,kFade,0.3f);

只要这么一行代码,就通过Fade(其实我也不知道是什么特效)的方式切换到你的GameScene了。当然头文件还是免不了的,但是你不用担心用哪个场景的头文件了,因为你只要用SceneFactory.h就可以了。

  1. #define SceneFactory SF

(其实你可以更懒的)。

猜你在找的Cocos2d-x相关文章